LINUX.ORG.RU

не работает alsa

 , ,


0

1

хочу данные с микрофона направить в динамик использовал пример отсюда http://equalarea.com/paul/alsa-audio.html

в консоль пишет «Неизвестная ошибка 1024» «Обрыв канала» «Неизвестная ошибка 1024»

int err;
short buf[1024];
snd_pcm_t *playback_handle;
snd_pcm_hw_params_t *hw_params;
unsigned int freq = 8000;

if ((err = snd_pcm_open (&playback_handle, "default", SND_PCM_STREAM_PLAYBACK, 0)) < 0) {
                qDebug() << "cannot open audio device " << QString::fromUtf8(snd_strerror (err));
                exit (1);
}
if ((err = snd_pcm_hw_params_malloc (&hw_params)) < 0) {
                qDebug() << "cannot allocate hardware parameter structure " << QString::fromUtf8(snd_strerror (err));
                exit (1);
}
if ((err = snd_pcm_hw_params_any (playback_handle, hw_params)) < 0) {
                qDebug() << "cannot initialize hardware parameter structure " << QString::fromUtf8(snd_strerror (err));
                exit (1);
}
if ((err = snd_pcm_hw_params_set_access (playback_handle, hw_params, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) {
                qDebug() << "cannot set access type " << QString::fromUtf8(snd_strerror (err));
                exit (1);
}
if ((err = snd_pcm_hw_params_set_format (playback_handle, hw_params, SND_PCM_FORMAT_S8)) < 0) {
                qDebug() << "cannot set sample format " << QString::fromUtf8(snd_strerror (err));
                exit (1);
}
if ((err = snd_pcm_hw_params_set_rate_near (playback_handle, hw_params, &freq, 0)) < 0) {
                qDebug() << "cannot set sample rate " << QString::fromUtf8(snd_strerror (err));
                exit (1);
}
if ((err = snd_pcm_hw_params_set_channels (playback_handle, hw_params, 1)) < 0) {
                qDebug() << "cannot set channel count " << QString::fromUtf8(snd_strerror (err));
                exit (1);
}
if ((err = snd_pcm_hw_params (playback_handle, hw_params)) < 0) {
                qDebug() << "cannot set parameters " << QString::fromUtf8(snd_strerror (err));
                exit (1);
}
snd_pcm_hw_params_free (hw_params);
if ((err = snd_pcm_prepare (playback_handle)) < 0) {
                qDebug() << "cannot prepare audio interface for use " << QString::fromUtf8(snd_strerror (err));
                exit (1);
}
            
snd_pcm_t *capture_handle;
snd_pcm_hw_params_t *hw_params_c;

if ((err = snd_pcm_open (&capture_handle, "default", SND_PCM_STREAM_CAPTURE, 0)) < 0) {
                qDebug() << "cannot open audio device " << QString::fromUtf8(snd_strerror (err));
                exit (1);
}
if ((err = snd_pcm_hw_params_malloc (&hw_params_c)) < 0) {
                qDebug() << "cannot allocate hardware parameter structure " << QString::fromUtf8(snd_strerror (err));
                exit (1);
}
if ((err = snd_pcm_hw_params_any (capture_handle, hw_params_c)) < 0) {
                qDebug() << "cannot initialize hardware parameter structure " << QString::fromUtf8(snd_strerror (err));
                exit (1);
}
if ((err = snd_pcm_hw_params_set_access (capture_handle, hw_params_c, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) {
                qDebug() << "cannot set access type " << QString::fromUtf8(snd_strerror (err));
                exit (1);
}
if ((err = snd_pcm_hw_params_set_format (capture_handle, hw_params_c, SND_PCM_FORMAT_S8)) < 0) {
                qDebug() << "cannot set sample format " << QString::fromUtf8(snd_strerror (err));
                exit (1);
}
if ((err = snd_pcm_hw_params_set_rate_near (capture_handle, hw_params_c, &freq, 0)) < 0) {
                qDebug() << "cannot set sample rate " << QString::fromUtf8(snd_strerror (err));
                exit (1);
}
if ((err = snd_pcm_hw_params_set_channels (capture_handle, hw_params_c, 1)) < 0) {
                qDebug() << "cannot set channel count " << QString::fromUtf8(snd_strerror (err));
                exit (1);
}
if ((err = snd_pcm_hw_params (capture_handle, hw_params_c)) < 0) {
                qDebug() << "cannot set parameters " << QString::fromUtf8(snd_strerror (err));
                exit (1);
}
snd_pcm_hw_params_free (hw_params_c);
if ((err = snd_pcm_prepare (capture_handle)) < 0) {
                qDebug() << "cannot prepare audio interface for use " << QString::fromUtf8(snd_strerror (err));
                exit (1);
}

            //===============================================================

while(1) {
                
  snd_pcm_readi(capture_handle, buf, 1024);
  err = snd_pcm_writei(playback_handle, buf, 1024);


  if (err == -EPIPE) {
      err = snd_pcm_prepare(playback_handle);
      if (err < 0) {
          qDebug() << "1 " << QString::fromUtf8(snd_strerror(err));
      }
  } else if (err == -ESTRPIPE) {
     while ((err = snd_pcm_resume(playback_handle)) == -EAGAIN){
        usleep(50);
     }
     if (err < 0) {
        err = snd_pcm_prepare(playback_handle);
        if (err < 0) {
           qDebug() << "2 " << QString::fromUtf8(snd_strerror(err));
        }
     }
  } else {
    qDebug() << "3 " << QString::fromUtf8(snd_strerror(err));
  }
 }



            snd_pcm_close (capture_handle);
            snd_pcm_close (playback_handle);
            exit (0);

Частота дискретизации 8000 вряд ли картой поддерживается, возможно в этом проблема.

curufinwe ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.