⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 linux音频编程2.txt

📁 我收集的一些关于linux(c)音频和视频编程的一些实例(有注释哦)爱好linux编程的有福了
💻 TXT
📖 第 1 页 / 共 3 页
字号:
name = argv[0];

/* 以只读方式打开混音设备 */
fd = open("/dev/mixer", O_RDONLY);
if (fd == -1) {
    perror("unable to open /dev/mixer");
    exit(1);
}

/* 获得所需要的信息 */
status = ioctl(fd, SOUND_MIXER_READ_DEVMASK, &devmask);
if (status == -1)
    perror("SOUND_MIXER_READ_DEVMASK ioctl failed");
status = ioctl(fd, SOUND_MIXER_READ_STEREODEVS, &stereodevs);
if (status == -1)
    perror("SOUND_MIXER_READ_STEREODEVS ioctl failed");

/* 检查用户输入 */
if (argc != 3 && argc != 4)
    usage();

/* 保存用户输入的混音器名称 */
dev = argv[1];

/* 确定即将用到的混音设备 */
for (i = 0 ; i < SOUND_MIXER_NRDEVICES ; i++)
    if (((1 << i) & devmask) && !strcmp(dev, sound_device_names[i]))
      break;
if (i == SOUND_MIXER_NRDEVICES) { /* 没有找到匹配项 */
    fprintf(stderr, "%s is not a valid mixer device\n", dev);
    usage();
}

/* 查找到有效的混音设备 */
device = i;

/* 获取增益值 */
if (argc == 4) {
    /* 左、右声道均给定 */
    left = atoi(argv[2]);
    right = atoi(argv[3]);
} else {
    /* 左、右声道设为相等 */
    left = atoi(argv[2]);
    right = atoi(argv[2]);
}

/* 对非立体声设备给出警告信息 */
if ((left != right) && !((1 << i) & stereodevs)) {
    fprintf(stderr, "warning: %s is not a stereo device\n", dev);
}

/* 将两个声道的值合到同一变量中 */
level = (right << 8) + left;

/* 设置增益 */
status = ioctl(fd, MIXER_WRITE(device), &level);
if (status == -1) {
    perror("MIXER_WRITE ioctl failed");
    exit(1);
}

/* 获得从驱动返回的左右声道的增益 */
left = level & 0xff;
right = (level & 0xff00) >> 8;

/* 显示实际设置的增益 */
fprintf(stderr, "%s gain set to %d%% / %d%%\n", dev, left, right);

/* 关闭混音设备 */
close(fd);
return 0;
}


编译好上面的程序之后,先不带任何参数执行一遍,此时会列出声卡上所有可用的混音通道:


[xiaowp@linuxgam sound]$ ./mixer
usage: ./mixer <device> <left-gain%> <right-gain%>
       ./mixer <device> <gain%>

Where <device> is one of:
vol pcm speaker line mic cd igain line1 phin video


之后就可以很方便地设置各个混音通道的增益大小了,例如下面的命令就能够将CD输入的左、右声道的增益分别设置为80%和90%:


[xiaowp@linuxgam sound]$ ./mixer cd 80 90
cd gain set to 80% / 90%


五、小结

随 着Linux平台下多媒体应用的逐渐深入,需要用到数字音频的场合必将越来越广泛。虽然数字音频牵涉到的概念非常多,但在Linux下进行最基本的音频编 程却并不十分复杂,关键是掌握如何与OSS或者ALSA这类声卡驱动程序进行交互,以及如何充分利用它们提供的各种功能,熟悉一些最基本的音频编程框架和 模式对初学者来讲大有裨益。

六、参考资料

1. OSS是Linux上最早出现的声卡驱动程序,http://www.opensound.com是它的核心网站,从中可以了解到许多与OSS相关的信息。

2. ALSA是目前广泛使用的Linux声卡驱动程序,并且提供了一些库函数来简化音频程序的编写,在其官方网站http://www.alsa-project.org/上可以了解到ALSA的许多信息,并能够下载到最新的驱动程序和工具软件。

3. Ken C. Pohlmann著,苏菲译,数字音频原理与应用(第四合版),北京:电子工业出版社,2002

4. 钟玉琢等编著,多媒体技术及其应用,北京:机械工业出版社,2003




一个测试通过的音频播放程序

#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/ioctl.h>
#include <stdlib.h>
#include <stdio.h>
#include <linux/soundcard.h>

#define LENGTH 3    /* 存储秒数 */
#define RATE 8000   /* 采样频率 */
#define SIZE 8      /* 量化位数 */
#define CHANNELS 1 /* 声道数目 */

/* 用于保存数字音频数据的内存缓冲区 */
unsigned char buf[LENGTH*RATE*SIZE*CHANNELS/8];

int main()
{
   
int fd;/* 声音设备的文件描述符 */
int id; /*声音输出文件描述符*/
int arg;/* 用于ioctl调用的参数 */
int status;   /* 系统调用的返回值 */
int i;
int j;



/* 打开声音设备 */
fd = open("/dev/dsp", O_RDWR);//arm下的音频文件是"/dev/sound/dsp";
if (fd < 0) {
   perror("open of /dev/dsp failed");
   exit(1);
}
/*打开输出文件*/
id=open("Music.wav",O_RDWR);
if(id < 0){
   perror("open of sound file failed");
   exit(1);
}
/* 设置采样时的量化位数 */
arg = SIZE;
status = ioctl(fd, SOUND_PCM_WRITE_BITS, &arg);
if (status == -1)
   perror("SOUND_PCM_WRITE_BITS ioctl failed");
if (arg != SIZE)
   perror("unable to set sample size");

/* 设置采样时的声道数目 */
arg = CHANNELS; 
status = ioctl(fd, SOUND_PCM_WRITE_CHANNELS, &arg);
if (status == -1)
   perror("SOUND_PCM_WRITE_CHANNELS ioctl failed");
if (arg != CHANNELS)
   perror("unable to set number of channels");

/* 设置采样时的采样频率 */
arg = RATE;
status = ioctl(fd, SOUND_PCM_WRITE_RATE, &arg);
if (status == -1)
   perror("SOUND_PCM_WRITE_WRITE ioctl failed");

/* 读取一定数量的音频数据,并将之写到输出文件中去 */
for(i=0;i<10;i++){
      j=read(id, buf, sizeof(buf)); 
      if (j > 0){
        write(fd, buf, j); /* 放音 */
      }
    }

/* 关闭输入、输出文件 */
close(fd);
close(id);
return 1;
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -