我正在学习在RaspBerry Pi 2上使用ALSA。我用C ++编写了一个小testing程序来生成一个440Hz的testing音调。 它使音调,但是有一个点击声音约每秒钟两次。
有没有人有一个想法,为什么这可能会发生? 代码如下。
#include <cmath> #include <climits> #include <iostream> #include <alsa/asoundlib.h> #include "deFinitions.hpp" using namespace std; int main() { int ret; snd_pcm_t* pcm_handle; // device handle snd_pcm_stream_t stream = SND_PCM_STREAM_PLAYBACK; snd_pcm_hw_params_t* hwparams; // harDWare information char* pcm_name = strdup("plughw:0,0"); // on-board audio jack int rate = 48000; const uint16 freq = 440; long unsigned int bufferSize = 8192*4; const uint32 len = bufferSize*100; const float32 arg = 2 * 3.141592 * freq / rate; sint16 vals[len]; for(int i = 0; i < len; i = i + 2) { vals[i] = SHRT_MAX * cos(arg * i / 2); } snd_pcm_hw_params_alloca(&hwparams); ret = snd_pcm_open(&pcm_handle,pcm_name,stream,0); cout << "opening: " << snd_strerror(ret) << endl; ret = snd_pcm_hw_params_any(pcm_handle,hwparams); cout << "Initializing hwparams structure: " << snd_strerror(ret) << endl; ret = snd_pcm_hw_params_set_access(pcm_handle,hwparams,SND_PCM_ACCESS_RW_INTERLEAVED); cout << "Setting access: " << snd_strerror(ret) << endl; ret = snd_pcm_hw_params_set_format(pcm_handle,SND_PCM_FORMAT_S16_LE); cout << "Setting format: " << snd_strerror(ret) << endl; ret = snd_pcm_hw_params_set_rate(pcm_handle,rate,(int)0); cout << "Setting rate: " << snd_strerror(ret) << endl; ret = snd_pcm_hw_params_set_channels(pcm_handle,2); cout << "Setting channels: " << snd_strerror(ret) << endl; ret = snd_pcm_hw_params_set_periods(pcm_handle,2,0); cout << "Setting periods: " << snd_strerror(ret) << endl; ret = snd_pcm_hw_params_set_buffer_size_near(pcm_handle,&bufferSize); cout << "Setting buffer size: " << snd_strerror(ret) << endl; ret = snd_pcm_hw_params(pcm_handle,hwparams); cout << "Applying parameters: " << snd_strerror(ret) << endl; cout << endl << endl; const voID* ptr = (const voID*)&vals; int err; do { ptr += bufferSize; ret = snd_pcm_writei(pcm_handle,ptr,len); if(ret < 0) { err = snd_pcm_prepare(pcm_handle); cout << "Preparing: " << snd_strerror(err) << endl; } } while(ret < 0); cout << "Writing data: " << ret << "," << snd_strerror(ret) << endl; }
当你运行它,你得到这个terminal输出。 当然,没有写错误,只是写入的位数。
pi@raspBerrypi:~/radio $ ./bin/alsatest opening: Success Initializing hwparams structure: Success Setting access: Success Setting format: Success Setting rate: Success Setting channels: Success Setting periods: Success Setting buffer size: Success Applying parameters: Success Writing data: 344110,UnkNown error 344110
更新 – 下一天确定。 我把输出连接到了我的便携式示波器上,看到下面的波形。 每次点击信号似乎都有一个不连续的地方。 我添加了几行来计算在我的正弦曲线arrays中有多less接近零的值彼此相邻,并且没有。 奇怪的是,ALSA示例程序/test/pcm.c是一个完美的波形。 也许我需要用非常小的块来写 我的代码和例子之间似乎没有太大的区别。
电视(电视)vIDeo的实时像素级分析build议
Java信号链接
Sox(Swiss Army Knife)用于沉默和噪音去除的algorithm是什么
autosys:KILLJOB事件离开孤立进程
GNU广播和野生动物追踪
使用malloc / free on callstack从Signal Handler回溯linux 64位
如何解决在linux 32位机上的REG_EIP未声明(首次在此函数中使用)错误?
一个VC ++的DSP SDK
class内信号处理
从任意audio文件中提取部分语音的好方法是什么?
总结以上是内存溢出为你收集整理的点击ALSA音源全部内容,希望文章能够帮你解决点击ALSA音源所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)