我正在学习在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 @R_318_4045@ion 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内信号处理
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。