linux录制声卡声音_Linux 下录制和播放 声音, record & play audio in linux

#include

#include

#include

#include

#include

#include

#include

#define LENGTH 3    /* how many seconds of speech to store */

#define RATE 44100   /* the sampling rate */

#define SIZE 16      /* sample size: 8 or 16 bits */

#define CHANNELS 1  /* 1 = mono 2 = stereo */

/* this buffer holds the digitized audio */

//unsigned char buf[LENGTH*RATE*SIZE*CHANNELS/8];

int main()

{

int fdplay;

int fdrec;

int arg;

int status;

FILE *fp = 0;

int i=0;

int bufferSize = 1024;

short *buf = 0;

/* open sound device */

fdplay = open("/dev/dsp", O_WRONLY);

if (fdplay < 0) {

printf("open of /dev/dsp failed\n");

return 0;

}

fdrec = open("/dev/dsp1", O_RDONLY);

if (fdrec < 0) {

printf("open of /dev/dsp2 failed\n");

exit(1);

}

/* set sampling parameters */

arg = SIZE;       /* sample size */

status = ioctl(fdplay, SOUND_PCM_WRITE_BITS, &arg);

if (status == -1)

{

printf("SOUND_PCM_WRITE_BITS ioctl failed\n");

goto exit;

}

if (arg != SIZE)

{

printf("unable to set play sample size\n");

goto exit;

}

arg = SIZE;       /* sample size */

status = ioctl(fdrec, SOUND_PCM_READ_BITS, &arg);

if (status == -1)

{

printf("SOUND_PCM_RAED_BITS ioctl failed\n");

goto exit;

}

if (arg != SIZE)

{

printf("unable to set rec sample size = %d\n", arg);

goto exit;

}

arg = CHANNELS;  /* mono or stereo */

status = ioctl(fdplay, SOUND_PCM_WRITE_CHANNELS, &arg);

if (status == -1)

{

printf("SOUND_PCM_WRITE_CHANNELS ioctl failed\n");

goto exit;

}

if (arg != CHANNELS)

{

printf("unable to set play number of channels\n");

goto exit;

}

arg = CHANNELS;  /* mono or stereo */

status = ioctl(fdrec, SOUND_PCM_READ_CHANNELS, &arg);

if (status == -1)

{

printf("SOUND_PCM_RAED_CHANNELS ioctl failed\n");

goto exit;

}

if (arg != CHANNELS)

{

printf("unable to set rec number of channels\n");

goto exit;

}

arg = RATE;       /* sampling rate */

status = ioctl(fdplay, SOUND_PCM_WRITE_RATE, &arg);

if (status == -1)

{

printf("SOUND_PCM_WRITE_WRITE ioctl failed");

goto exit;

}

arg = RATE;       /* sampling rate */

status = ioctl(fdrec, SOUND_PCM_READ_RATE, &arg);

if (status == -1)

{

printf("SOUND_PCM_READ_WRITE ioctl failed");

goto exit;

}

//fp = fopen("1.wav", "r");

buf = (short*)malloc(bufferSize*4);

while (1)

{

if(read(fdrec, buf, bufferSize*4) != bufferSize*4)

{

printf("read file failed\n");

break;

}

printf("Play one sample %d\n", i++);

if ((write(fdplay, buf, bufferSize*4)) != bufferSize*4)

{

printf("PLay one buffer %d\n", i++);

break;

}

if(i >100)

break;

//status = ioctl(fd, SOUND_PCM_SYNC, 0);

/*if (status == -1)

{

printf("SOUND_PCM_SYNC ioctl failed");

break;

}*/

}

free(buf);

ioctl(fdplay, SOUND_PCM_SYNC, 0);

exit:

close(fdplay);

close(fdrec);

}

(carlsonlee_freec)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值