小さな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をより短いサンプルを再生する方法を困惑しています。
正確なフレームまたはバッファサイズの複数で作業する必要があるかどうかはわかりませんが、私は非常に提案しています。
野生の推測:再生時間が250000usよりも長い== 500000usが原因です。レイテンシ== 0の場合は? –
最後の書き込み呼び出し後にプログラムは何をしていますか? –
@Tom Goodfellowうわー、うまくいった!これは小さなモールスコードアプリケーションです。私はいくつかのビープ音を書くことができますが、私は2回目のプログラムを実行する場合、それは常に再生されません。私はバッファをフラッシュするか、何かをリセットする必要があると思う。確かではない。しかしそれは有望に見える。ありがとう。 – captcha