2012-02-09 2 views
2

Я пытаюсь использовать асинхронную функцию обратного вызова ALSA, чтобы я мог обеспечить функциональность паузы и возобновления на уровне приложения. Но функция async_add_pcm_handler() возвращает ошибку (возвращается -38 более конкретно).Alsa асинхронный обратный вызов

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. Не могли бы вы указать на возможную ошибку.

+0

Вы можете вызвать _const полукокса * snd_strerror (интермедиат errnum) _, чтобы получить сообщение от кода ошибки, которые могут помочь (HTTP : //www.alsa-project.org/alsa-doc/alsa-lib/group___error.html#gd174fcc147831046749051725762dd69) –

+1

@JoachimIsaksson Описание было «Function not Implemented». Любое, как это похоже на использование асинхронных обратных вызовов alsa, не рекомендуется в любом случае для переноса и т. Д. Есть ли другой метод, чтобы я мог реализовать функции paus/resume на уровне приложения. – nagavamsikrishna

+0

Итак, вы преуспели? – pavelkolodin

ответ

0

У меня была проблема с теми же симптомами, что и у вас, поэтому я надеюсь, что решение будет таким же.

Моим решением было то, что вместо открытия устройства «по умолчанию» вы открываете свое аудиоустройство напрямую. Это аудиоустройство с именем типа «hw: someName». Я считаю, что первоначальная проблема заключается в том, что устройство «по умолчанию» - это виртуальное устройство, которое сопряжено с сервером pulseAudio Sound - на моем Linux-сервере Ubuntu это так или иначе. Поскольку звуковой сервер pulseAudio не поддерживает полный API ALSA, вы получаете ошибку «функция не реализована».

Для уточнения решения, заменить

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); 
Смежные вопросы