現在、Ubuntuでマイクからの信号をスピーカーから出力しようと四苦八苦しております。
"マイクからの信号"といっても通常のライン入力ではなく、
一度マイコンでAD変換された信号をシリアル通信でPCに送り、
PC側でRAWデータのままスピーカーから出力しようとしています。
*複数のマイクを用途に応じて使い分けるため、
全てのマイクのデータを一旦マイコンで受けれる構成にしています。
現在、シリアル通信で1つのマイクのデータを受信し、そのデータをスピーカーから出力できるようになったのですが、
音が途切れ途切れになってしまいます。
原因は、シリアル信号の受信と音声出力が同時に行われないためと推測しますが、
対策方法がわかりません。
対策方法や、もっと簡単な方法があるのであればご教授願いたく。
ソースコードは以下です。
#include <stdlib.h> #include <stdio.h> #include <sys/wait.h> #define SERIAL_PORT "/dev/ttyUSB2" #define BAUDRATE B115200 int main(int argc, char* argv[]){ unsigned char buf[255]; FILE *fp; fp = fopen("tmpFile.raw","w"); //シリアル通信の設定 int fd; struct termios oldtio, newtio; fd = open(SERIAL_PORT, O_RDWR); ioctl(fd, TCGETS, &oldtio); newtio = oldtio; newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD; ioctl(fd, TCSETS, &newtio); while(1){ int pid; pid = fork(); if(pid < 0){ return -1; } if(pid == 0){ execlp("aplay", "aplay", "tmpFile.raw", NULL);//音声を再生 exit(99); }else{ int status; waitpid(pid, &status, 0); fp = fopen("tmpFile.raw", "w");//tmpFileをクリアする int len = read(fd, buf, sizeof(buf)); if(len > 0){ for(int i=0; i<len; i++){ fputc(buf[i],fp);//ファイルに書き込み } } fflush(fp);//ファイルにバッファ分を書き込み } } ioctl(fd, TCSETS, &oldtio); fclose(fp); close(fd); }
追記:
上記のコードは、シリアル通信のデータを毎回ファイルに書き込んでいますが、
シリアル通信の結果をパイプでaplayに接続すれば、高速に処理出来て音飛びが発生しないのでは
と考えています。
*まだそのやりかたがわかっていません・・・

回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/02 15:01
2018/11/02 15:23
2018/11/02 15:28
2018/11/05 01:26 編集
2018/11/05 01:44