처음 Open sound System 메뉴얼을 보고 작성해 본 코드이다. 정말 백악기때 코드이지만..

    조만간 또 사용할 것 같다는 불길한 예감이 든다.

    그냥 아무생각없이 프로그램 짤 때 이용하기 편리하다.

    원본 출처 및 문의는 :

    http://embeddedclub.net

    으로 해주기 바란다.

    #include <sys/types.h>
    #include <sys/stat.h>
    #include <sys/soundcard.h>
    #include <sys/ioctl.h>
    #include <unistd.h>
    #include <fcntl.h>
    #include <errno.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>

    #define DEBUG
    #define SECONDS 10 // 재생시간 (초)

        // DSP Setting!
        // handle = Dsp Control
        // chans = 0 : Mono (1 Channel) / 1: Stereo (2 Channel)
        /* fmt = AFMT_QUERY : 현재 사용되는 오디오 포멧을 알려줌
                     AFMT_MU_LAW : mu-law 로그 급수로 늘어나는 인코딩
                     AFMT_A_LAW : a-law 로그 급수로 늘어나는 인코딩 (잘안씀)
                     AFMT_IMA_ADPCM : 4:1 압축된 포멧(SB16은 호환안됨)
                     AFMT_S16_LE : PC에서 부호있는 리틀엔디안 방식의 인코딩
                     AFMT_S16_BE : M68K,PowerPC등에서 부호있는 빅엔디안
                     AFMT_S16_NE : 기계의 네이티브 엔디안 컨벤션
                     AFMT_S8 : 부호있는 8비트 오디오 포멧
                     AFMT_S32_LE : 부호화된 32비트 리틀엔디안 포멧
                     AFMT_S32_BE : 부호화된 32비트 빅엔디안 포멧
                     AFMT_U8 : PC에서 부호없는 8비트 오디오 인코딩에 사용됨
                     AFMT_U16_LE : 부호없는 16비트 리틀엔디안 포멧
                     AFMT_U16_BE : 부호없는 16비트 빅엔디안 포멧
                     AFMT_MPEG : MPEG MP2, MP3 포멧 (일반적으로 지원안됨)
        */
        // rate = Sound Bitrate
        // data = Data Buffer


    int main(int argc, char** argv)
    {
        int fd1,fd2;
        int handle;
        int s_flag = 1;
        int s_fmt = AFMT_U8;
        int s_chans = 0;
        int s_rate = 22000;

        char file[20] = "default.pcm";
        unsigned char* data;
        
    /*
        if(argc<6)
        {
            printf("\n\n========== SND TEST 0.0.1 =========\n");
            printf(" usage follow : \n");
            printf("-----------------------------------\n");
            printf("ex>\n");
            printf("   ./oss p test.pcm 1 AFMT_U8 22000\n");
            printf(" \n");
            printf("-----------------------------------\n");
            printf("Test Factory...                    \n");
            printf("===================================\n");
            exit(1);
        }    
    */                        
    /* argv[0] = Program Name      /   argv[1] = Switch Flag        
       argv[2] = Open File Name    /   argv[3] = Channel Setting
       argv[4] = Format Setting    /   argv[5] = Sound Bit Rate */
      
    #ifdef DEBUG
       printf("============ DEFAULT SUMMARY =============\n");
       printf("FLAG - %d / FILE - %s / FORMAT - %d\n",s_flag,file,s_fmt);
       printf("CHAN - %d / RATE - %d\n", s_chans,s_rate);
       printf("==========================================\n");
    #endif
        
    /* 사운드 카드에 해당하는 파일에 쓰기 위해(write)
           파일을 연다(open). DSP = Digital Signal Processor
            Default : O_WRONLY */
        
        if((handle = open("/dev/dsp",O_RDWR)) == -1)
        {
            perror("Open /dev/dsp error!");
            return -1;
        }

        /* 재생하려는 소리에 해당하는 체널을 사운드카드에 알림
           0 = 모노, 1 = 스테레오 */
        if(ioctl(handle,SNDCTL_DSP_STEREO,&s_chans)==-1)
        {
            perror("IOCTL Channel Setting ERROR!");
            return errno;
        }

        /* 자료 형식을 사운드카드에게 알린다. */
        if(ioctl(handle, SNDCTL_DSP_SETFMT,&s_fmt)== -1)
        {
            perror("ioctl format");
            return errno;
        }

        /* DSP 재생율(playback rate), 즉 raw PCM 음의 샘플링
           빈도를 지정한다. */
        if (ioctl(handle, SNDCTL_DSP_SPEED, &s_rate) == -1)
        {
            perror("ioctl sample rate");
            return errno;
        }

        /* 빈도 * 5 초 * 두 채널 */
        data = malloc(s_rate*SECONDS*(s_chans+1));

        fd1 = open(file,O_RDWR);
        if(fd1==-1)
        {
            perror("open file error\n");
            exit(1);
        }

        /* demo 파일에 저장된 정보를 읽어서 할당한 메모리로 읽음 */
        read(fd1,data,s_rate*SECONDS*(s_chans+1));
        
        close(fd1);

        /* 읽은 내용을 DSP에 쓴다 (write), 그 후 재생이 시작된다. */
        write(handle,data,s_rate*SECONDS*(s_chans+1));
        if(ioctl(handle, SNDCTL_DSP_SYNC) == -1)
        {
                perror("ioctl sync");
                return errno;
        }
        getc();
        printf("Speaking.....!!\n");
        fd1 = open(file,O_RDWR);
        data = malloc(s_rate*SECONDS*(s_chans+1));
        read(handle,data,s_rate*SECONDS*(s_chans+1));
        write(fd1,data,s_rate*SECONDS*(s_chans+1));
        close(fd1);
        free(data);
        
        close(handle);
        
        printf("DONE!");

        return 0;
    }

    반응형
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기