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

#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    /* 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);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值