Linux论坛's Archiver

《开源》旗舰电子杂志2008年11期发布,火热下载中!

lishuzheng 发表于 2007-12-28 08:49

linux下的声音编程

想在linux 下进行语音编码!但是linux录音的函数是read(fd,buf,size)
其中buf是存储录音数据的,但是它的类型是char*的,我想把它变成short*类型的,
然后存储为short类型的数组中,请问应该怎么编程?????
录音程序如下:
#include <sys/ioctl.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/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 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");

}
}

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.