当前位置:首页 > 芯闻号 > 充电吧
[导读]音频录放框架 下面给出一个利用声卡上的DSP设备进行声音录制和回放的基本框架,它的功能是先录制几秒种音频数据,将其存放在内存缓冲区中,然后再进行回放,其所有的功能都是通过读写/dev/dsp设备文件来

音频录放框架 下面给出一个利用声卡上的DSP设备进行声音录制和回放的基本框架,它的功能是先录制几秒种音频数据,将其存放在内存缓冲区中,然后再进行回放,其所有的功能都是通过读写/dev/dsp设备文件来完成的:
 
/*
 * sound.c
 */
#include 
#include 
#include 
#include 
#include 
#include 
#include 
 
#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 arg; /* 用于ioctl调用的参数 */
 int status;   /* 系统调用的返回值 */
 
 /* 打开声音设备 */
 fd = open("/dev/dsp", O_RDWR);
 if (fd < 0) {
    perror("open of /dev/dsp 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");
 
 /* 循环,直到按下Control-C */
 while (1) {
    printf("Say something:n");
    status = read(fd, buf, sizeof(buf)); /* 录音 */
    if (status != sizeof(buf))
      perror("read wrong number of bytes");
 
    printf("You said:n");
    status = write(fd, buf, sizeof(buf)); /* 回放 */
    if (status != sizeof(buf))
      perror("wrote wrong number of bytes");
 
    /* 在继续录音前等待回放结束 */
    status = ioctl(fd, SOUND_PCM_SYNC, 0); 
    if (status == -1)
      perror("SOUND_PCM_SYNC ioctl failed");
 }
}
  4.4 混音器框架 下面再给出一个对混音器进行编程的基本框架,利用它可以对各种混音通道的增益进行调节,其所有的功能都是通过读写/dev/mixer设备文件来完成的:
 
/*
 * mixer.c
 */
#include 
#include 
#include 
#include 
#include 
#include 
 
/* 用来存储所有可用混音设备的名称 */
const char *sound_device_names[] = SOUND_DEVICE_NAMES;
 
int fd;                  /* 混音设备所对应的文件描述符 */
int devmask, stereodevs; /* 混音器信息对应的位图掩码 */
char *name;
 
/* 显示命令的使用方法及所有可用的混音设备 */
void usage()
{
 int i;
 
 fprintf(stderr, "usage: %s   n"
       "       %s  nn"
       "Where  is one of:n", name, name);
 for (i = 0 ; i < SOUND_MIXER_NRDEVICES ; i++)
    if ((1 << i) & devmask) /* 只显示有效的混音设备 */
      fprintf(stderr, "%s ", sound_device_names[i]);
 fprintf(stderr, "n");
 exit(1);
}
 
int main(int argc, char *argv[])
{
 int left, right, level; /* 增益设置 */
 int status;              /* 系统调用的返回值 */
 int device;              /* 选用的混音设备 */
 char *dev;               /* 混音设备的名称 */
 int i;
 
 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 devicen", 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 devicen", 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   
       ./mixer  
Where  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%

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭