Требуется учебник ALSA - PullRequest
       15

Требуется учебник ALSA

12 голосов
/ 13 декабря 2011

Я новичок в звуковом программировании. Я хочу создать небольшое приложение, которое способно воспроизводить звук и дает регулировку громкости.Я использую alsa-lib.

Я хочу знать, для чего нужен переключатель (например, переключатель Master Playback), перечисление в элементах микшера и какое значение я должен установить для этих переключателей.

Пожалуйста, предложите мне некоторый учебник длянастройки микшера, а также программирование alsa.

Ответы [ 3 ]

12 голосов
/ 26 июля 2013

Просто собираю здесь несколько примеров с кодом примера:

Обратите внимание, что некоторые из них устарели, и API может тем временем измениться ... вы также можете посмотреть aplay.c (источник для командной строки arecord и aplay), но этот не самый простой для чтения для начинающих ...

6 голосов
/ 13 декабря 2011

Вам будет нелегко найти что-то конкретное в ALSA, как я понял, только начав изучать его. Лучшее место для начала - домашняя страница проекта ALSA , где приводятся ссылки на несколько учебных пособий, лучшим из которых является одно ИМО доктора Нагорного.

Судя по тому, что вы пытаетесь сделать, JACK , скорее всего, будет более быстрым и простым решением, однако.

1 голос
/ 19 декабря 2015

Проверьте документы.Есть несколько хороших примеров.

http://www.alsa -project.org / alsa-doc / alsa-lib / examples.html

Помните о безопасном подмножестве alsa.

https://www.winehq.org/pipermail/wine-bugs/2009-June/179698.html

Вот что-то маленькое, что я собрал, используя различные источники, которые я смог найти.Это может быть хорошей отправной точкой.

/* Compile with gcc -lasound -pthread threadaudio.c */

#include <alsa/asoundlib.h>
#include <pthread.h>
#include <stdio.h>

unsigned char audiobuffer[0x400];
pthread_mutex_t audiomutex = PTHREAD_MUTEX_INITIALIZER;

void changeaudio (int volume) {
  int i;
  pthread_mutex_lock(&audiomutex);
  for (i = 0; i < sizeof(audiobuffer); i++)
    audiobuffer[i] = (random() & 0xff) * volume / 10;
  pthread_mutex_unlock(&audiomutex);
}

void *startaudio (void *param)
{
  static char *device = "default";
  snd_output_t *output = NULL;
  int *audiostop = (int*)param;
  int err;
  snd_pcm_t *handle;
  snd_pcm_sframes_t frames;

  changeaudio(5);

  if ((err = snd_pcm_open(&handle, device, SND_PCM_STREAM_PLAYBACK, 0)) < 0) {
    printf("Playback open error: %s\n", snd_strerror(err));
    exit(EXIT_FAILURE);
  }

  if ((err = snd_pcm_set_params(handle,
                SND_PCM_FORMAT_U8,
                SND_PCM_ACCESS_RW_INTERLEAVED,
                1,
                48000,
                1,
                100000)) < 0) {   /* 0.1sec */
    printf("Playback open error: %s\n", snd_strerror(err));
    exit(EXIT_FAILURE);
  }

  while (!*audiostop) {
    err = snd_pcm_wait(handle, 1000);
    if (err < 0) {
      fprintf (stderr, "poll failed (%d)\n", err);
      break;
    }

    pthread_mutex_lock(&audiomutex);
    frames = snd_pcm_writei(handle, audiobuffer, sizeof(audiobuffer));
    pthread_mutex_unlock(&audiomutex);

    if (frames < 0)
      err = snd_pcm_recover(handle, frames, 0);
    if (err < 0) {
      printf("snd_pcm_writei failed: %s\n", snd_strerror(err));
      break;
    }

    if (frames > 0 && frames < (long)sizeof(audiobuffer))
      printf("Short write (expected %li, wrote %li)\n", (long)sizeof(audiobuffer), frames);
  }
  snd_pcm_close(handle);  
}

int main(void)
{
  pthread_t audiothread;
  int audiostop = 0;
  int volume;

  pthread_create(&audiothread, NULL, startaudio, &audiostop);

  while (1) {
    printf("Enter volume 1 through 10. [0 to quit.]: ");
    scanf("%d", &volume);
    if (volume == 0) break;
    changeaudio(volume);
  }

  audiostop = 1;
  pthread_join(audiothread, NULL);

  return 0;
}

И после прочтения кода выше вы, вероятно, захотите прочитать эту статью, касающуюся (среди прочего) не использования блокировок.

http://www.rossbencina.com/code/real-time-audio-programming-101-time-waits-for-nothing

...