라즈베리파이 마이크 녹음 - lajeubelipai maikeu nog-eum

#include <stdio.h> #include <unistd.h> #include <termios.h> // 터미널 속성을 변경하는 함수를 사용하기 위하여 #include "TWAPI_PI01.h" // TipswareAC 라이브러리를 사용하기 위한 헤더 파일 #include "tipsware_audio_codec.h" // ALSA 라이브러리를 사용하기 위한 헤더 파일 #include "/usr/include/alsa/asoundlib.h" // OpenSoundDevice 함수는 확성기 예제에서 가져오시면 됩니다. // http://blog.naver.com/tipsware/221013288654 int main(int argc, char *argv[]) { if (argc < 3) { // 인자가 3개보다 작다면 옵션을 제대로 입력하지 않았다는 뜻이다. // 옵션을 제대로 입력하도록 메시지를 보여주고 프로그램을 종료합니다. printf("[ Error ] Require Option!!\n"); printf("Recording Example: ./a.out -r tips.dat\n"); printf("Play Example: ./a.out -p tips.dat\n"); return -1; } // TipswareAC 코덱을 사용하기 위하여 초기화 함 www_tipsware_com_TipsWareAudioCodec(); char check_key = 0, is_play; struct termios org_term = NonBlockingTerminalMode(); // temp_buffer -> 음성 녹음시 사용, temp_data -> 압축된 데이터 저장 char temp_buffer[4800], temp_data[256]; FILE *p_file; snd_pcm_t *p_sound_device; if (argv[1][1] == 'r') { // 녹음 모드인 경우 p_file = fopen(argv[2], "wb"); // 쓰기 모드로 파일을 연다. // 음성 압축 코덱을 위한 준비 작업을 함 Initialize_Coder(); is_play = 0; // 녹음 모드를 설정 p_sound_device = OpenSoundDevice(1); // 녹음 장치를 연다. } else { // 재생 모드인 경우 p_file = fopen(argv[2], "rb"); // 읽기 모드로 파일을 연다. // 압축된 음성을 압축 해제하기 위한 준비 작업을 함 Initialize_Decoder(); is_play = 1; // 재생 모드를 설정 p_sound_device = OpenSoundDevice(0); // 재생 장치를 연다. } snd_pcm_prepare(p_sound_device); // 녹음 또는 재생 준비 printf("Press ESC key to Exit Program!!\n"); unsigned char temp_size; while (check_key != 27) { check_key = GetNonBlockingInput(); if (is_play == 0) { // 녹음 모드인 경우 // 2400개의 데이터를 샘플링을 한다. -> 4800바이트 저장 snd_pcm_readi(p_sound_device, temp_buffer, 2400); // 녹음된 4800바이트의 음성 데이터를 압축한다. 압축된 데이터는 temp_data에 // 저장되고 temp_size에는 압축된 크기가 저장된다. temp_size = (unsigned char)TWAPI_EncodingAudioStream((short int *)temp_buffer, temp_data); // 압축된 데이터의 크기를 알려주기 위해서 temp_size 변숫값을 파일에 먼저 저장한다. fwrite(&temp_size, sizeof(temp_size), 1, p_file); // 압축된 음성 데이터를 파일에 저장한다. fwrite(temp_data, temp_size, 1, p_file); } else { // 재생 모드인 경우 // 1바이트 크기의 '압축된 음성 데이터의 크기 정보'를 읽는다. // 만약 1바이트를 못읽었다면 voice.dat 파일에 있는 내용을 다 읽었다는 뜻이다. if(fread(&temp_size, 1, 1, p_file) > 0) { // 읽은 크기를 기준으로 압축된 음성 데이터를 읽는다. fread(temp_data, temp_size, 1, p_file); // 압축된 음성 데이터를 해제한다. 압축이 해제되면 4800 바이트 크기의 데이터로 복원된다. TWAPI_DecodingAudioStream(temp_data, temp_size, (short int *)temp_buffer); // 녹음했던 데이터를 재생한다. snd_pcm_writei(p_sound_device, temp_buffer, 2400); // 4800 바이트의 데이터를 재생하는데 0.3초가 걸리지만 파일을 읽고 압축을 해제하는 시간을 // 고려해서 0.25초만큼 지연 시킨다. usleep(250000); } else { usleep(500000); // 재생되던 음성이 완료될 때까지 500 ms 만큼 추가로 지연 시킨다. printf("End of Voice!!\n"); break; // 반복문을 중단시켜서 재생 작업을 중지한다. } } } snd_pcm_drop(p_sound_device); // 녹음 또는 재생 중지 snd_pcm_close(p_sound_device); // 녹음 또는 재생 장치 닫기 if (p_file != NULL) fclose(p_file); // 파일 닫기 ResetNonBlockingTerminalMode(org_term); return 0; }