您的位置:首页 > 运维架构 > Linux

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

2011-03-09 12:14 736 查看
#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);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息