Я пытаюсь использовать асинхронную функцию обратного вызова ALSA, чтобы я мог обеспечить функциональность паузы и возобновления на уровне приложения. Но функция async_add_pcm_handler()
возвращает ошибку (возвращается -38 более конкретно).Alsa асинхронный обратный вызов
rc = snd_pcm_open(&handle, (char*)"default",SND_PCM_STREAM_PLAYBACK, 0);
snd_pcm_hw_params_alloca(¶ms);
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 полукокса * snd_strerror (интермедиат errnum) _, чтобы получить сообщение от кода ошибки, которые могут помочь (HTTP : //www.alsa-project.org/alsa-doc/alsa-lib/group___error.html#gd174fcc147831046749051725762dd69) –
@JoachimIsaksson Описание было «Function not Implemented». Любое, как это похоже на использование асинхронных обратных вызовов alsa, не рекомендуется в любом случае для переноса и т. Д. Есть ли другой метод, чтобы я мог реализовать функции paus/resume на уровне приложения. – nagavamsikrishna
Итак, вы преуспели? – pavelkolodin