2016-11-03 5 views
2

小さなCプログラムで可変長の短いトーンをALSAまで生成しようとしています。いくつかの例では、1秒間のサウンドを再生するとうまくいきましたが、それより短いものはまったくサウンドを生成しません。ALSAでショートトーンを再生する方法

私はそうのような正弦波でバッファを満たしています:

if ((err = snd_pcm_set_params(handle, 
           SND_PCM_FORMAT_FLOAT, 
           SND_PCM_ACCESS_RW_INTERLEAVED, 
           1, 
           44100, 
           1, 
           500000)) < 0) { 
printf("Playback open error: %s\n", snd_strerror(err)); 
exit(EXIT_FAILURE); 
} 

再生:PCMデバイス・パラメータの設定

#define BUFFER_LEN 44100 
int freq = 700;    //audio frequency 
int fs = 44100;    //sampling frequency 
float buffer [BUFFER_LEN]; 
for (k=0; k<BUFFER_LEN; k++) { 
    buffer[k] = (sin(2*M_PI*freq/fs*k));         
} 

frames = snd_pcm_writei(handle, buffer, BUFFER_LEN); 

をしかし、私はしたい場合それを変更するには、音を再生する、言い換えれば1/4秒(つまりBUFFER_LENから11025に変更する)は何も来ませんもうスピーカーの外に出る。

フロートからショートにタイプを変更して、PCM_FORMATを他の値に設定し、バッファに正弦波を充填するさまざまな方法を試しました。

何かがあれば、私はスピーカーで少し「ビープ音」が聞こえますが、私が期待するものではありません。プログラムはsegfaultsまたはクラッシュしませんが、私はちょうどALSAをより短いサンプルを再生する方法を困惑しています。

正確なフレームまたはバッファサイズの複数で作業する必要があるかどうかはわかりませんが、私は非常に提案しています。

+0

野生の推測:再生時間が250000usよりも長い== 500000usが原因です。レイテンシ== 0の場合は? –

+0

最後の書き込み呼び出し後にプログラムは何をしていますか? –

+0

@Tom Goodfellowうわー、うまくいった!これは小さなモールスコードアプリケーションです。私はいくつかのビープ音を書くことができますが、私は2回目のプログラムを実行する場合、それは常に再生されません。私はバッファをフラッシュするか、何かをリセットする必要があると思う。確かではない。しかしそれは有望に見える。ありがとう。 – captcha

答えて

1

サンプルがバッファにサンプルを書き込んだり、バッファからサンプルを読み込み、それらを再生することは、非同期に実行される2つの異なるプロセスです。

書き込みしようとしているサンプル量のバッファに十分な空き領域がない場合、十分な領域があるまで、snd_pcm_writei()は待機します。しかし、snd_pcm_writei()が返ってくると、サンプルのフルバッファまで再生されていない可能性があります。

バッファが空になるまで待つには、snd_pcm_drain()を使用します。

+0

私はsnd_pcm_drain()をすべての書き込みの始めまたは終わりに使用しますか?とにかく、私はいくつかの前進を行い、レイテンシを10000に設定することによって、良い再生を得ています。 sndデバイスを閉じるまでは、コンソールへのprintf()コマンドはブロックされていることに気付きました。 – captcha

+0

バッファが空になるのを待つときに使用します。 –

関連する問題