#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; } |
|
|
최근댓글