我是audio编程的新手。我想创build一个能够播放和控制音量的小应用程序。 我正在使用alsa-lib。
我想知道什么是开关(ex.Master回放开关)的目的,在混音器元素枚举和我应该设置什么值给那些开关。
请教我一些混音器设置的教程以及alsa编程。
只是收集一些在这里,有示例代码:
请注意,其中一些是旧的,并且API可能在此期间已经改变…您也可以查找aplay.c
(命令行源码arecord
和aplay
),但是这对于初学者来说不是最容易阅读的…
就像我从刚开始学习的时候发现的那样,你将会在ALSA上找到具体的东西。 最好的开始是ALSA项目主页 ,他们链接到一些教程,最好的是Nagorni博士的一个IMO。
从听起来你想要做的事情来看, JACK很可能是一个更快更简单的解决方案。
查看文档。 有一些很好的例子。
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