【问题标题】:Alsa asynchronous callbackAlsa 异步回调
【发布时间】:2012-03-01 15:02:26
【问题描述】:

我正在尝试使用 ALSA 的异步回调功能,以便可以在应用程序级别提供暂停和恢复功能。但是函数async_add_pcm_handler()返回一个错误(返回-38更具体)。

rc = snd_pcm_open(&handle, (char*)"default",SND_PCM_STREAM_PLAYBACK, 0);
snd_pcm_hw_params_alloca(&params);
snd_pcm_hw_params_any(handle, params);
snd_pcm_hw_params_set_format(handle, params,SND_PCM_FORMAT_S16_LE);
snd_pcm_hw_params_set_channels(handle, params, 1);
val = 22050;
snd_pcm_hw_params_set_rate_near(handle, params,&val, &dir);
frames=128;
snd_pcm_hw_params_set_period_size_near(handle,params, &frames, &dir);
snd_pcm_hw_params(handle, params);
snd_pcm_hw_params_get_period_size(params, &frames,&dir);
size = frames * 2;

pcmfile=fopen("output.pcm","rb");
fseek(pcmfile,0,SEEK_SET);
buffer=(char*)malloc(size);
memset(buffer,0,size);

if(snd_async_add_pcm_handler(&pcm_callback, handle, MyCallback, NULL) != 0) {
    printf("handler not successful\n");
}

while(!feof(pcmfile)){
    returnvalue=fread(buffer,sizeof(char),size,pcmfile);
    snd_pcm_writei(handle, buffer, frames);
}

以上是我正在使用的一段代码,并定义了函数 MyCallback。你能指出我可能的错误吗?

【问题讨论】:

  • 您可以调用 const char* snd_strerror(int errnum) 从您的错误代码中获取消息,这可能会有所帮助 (alsa-project.org/alsa-doc/alsa-lib/…)
  • @JoachimIsaksson 描述是“功能未实现”。无论如何都不推荐使用异步alsa回调进行移植等。是否有其他方法可以在应用程序级别实现暂停/恢复功能。
  • 因为我需要的是暂停/播放功能,所以我最终将 PCM 数据分成小块并一一写入 ALSA。如果 Pause() 被调用,那么我将停止编写这些块。

标签: linux asynchronous resume alsa


【解决方案1】:

我遇到了与您的症状完全相同的问题,所以我希望解决方案是相同的。

我的解决方案是直接打开音频设备,而不是打开“默认”设备。那是名称类似于“hw:someName”的音频设备。 我相信最初的问题是“默认”设备是与 pulseAudio Sound 服务器接口的虚拟设备 - 在我的 Ubuntu linux 上无论如何都是如此。由于 pulseAudio 声音服务器不支持完整的 ALSA API,您会收到“功能未实现”错误。

为了澄清解决方案,替换

rc = snd_pcm_open(&handle, (char*)"default",SND_PCM_STREAM_PLAYBACK, 0);

rc = snd_pcm_open(&handle, (char*)"hw:someName",SND_PCM_STREAM_PLAYBACK, 0);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-28
    • 2013-01-30
    • 1970-01-01
    • 1970-01-01
    • 2020-04-30
    • 2011-08-24
    • 2017-05-15
    • 1970-01-01
    相关资源
    最近更新 更多