我是音频编程的新手,我想创建能够播放和提供音量控制的小应用程序。我正在使用alsa-lib。
我想知道开关(ex.Master播放开关)的用途,混音器元素中的枚举,以及我应该为这些开关设置什么值。
请向我推荐一些关于调音台设置以及alsa编程的教程。
发布于 2013-07-26 05:56:12
我在这里收集了一些,其中有示例代码:
请注意,其中一些是旧的,API可能在此期间发生了变化……您还可以查找aplay.c (命令行arecord和aplay的源代码),但对于初学者来说,这并不是最容易阅读的……
发布于 2011-12-13 17:37:35
你将很难在ALSA上找到任何具体的东西,正如我刚开始学习它时所发现的那样。最好的起点是ALSA project homepage,在那里他们可以链接到许多教程,其中最好的是Nagorni博士的one IMO。
不过,从您想要做的事情来看,JACK很可能是一个更快、更容易的解决方案。
发布于 2015-12-19 18:35:39
看看这些文档。有一些很好的例子。
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
https://stackoverflow.com/questions/8485553
复制相似问题