| ||||
| ||||
//||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| // || //-- 프로그래밍에 사용 할 헤더 파일들 선언 || // || //||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| #include #include #include #include #include "resource.h"
//-- WAVEFORMATEXTENSIBLE 에서 필요한 헤더 파일들 선언 #include #include #include #include
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| //-- Global variable 선언 부분 시작--|| //|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//-- WndProc 및 외부 변수 선언 TCHAR szAppName[] = TEXT ("WAVE WIZARD V0.47a23"); HINSTANCE g_hInst;
//-- 파일 처리(읽기) OPENFILENAME OFN ; char caFileName [MAX_PATH] = " " ;
//-- Wave 처리용 static HWAVEOUT hWaveOut ;
WAVEFORMATEXTENSIBLE waveFormatEx; MMCKINFO mmCkInfoRIFF; MMCKINFO mmCkInfoChunk; HMMIO hMMIO; DWORD waveSize; //-- Chunk header를 뺀 WaveData의 총 길이
//-- char ayyray char ca_wFormatTag [50] ; char ca_nChannels [50] ; char ca_nSamplesPerSec [50] ; char ca_nAvgBytesPerSec [50] ; char ca_nBlockAlign [50] ; char ca_wBitsPerSample [50] ; char ca_cbSize [50] ; char ca_lpstrFile [40] ; // File Location..
//--수직 TrackBar int xPos = 0 ; int xInc = 0 ; int xMax = 1024 ; char ca_xPos[10] ;
static BOOL bRecording, bReverse, bPlaying, bPaused, bEnding, bTerminating, bMute ;
static DWORD dwDataLength ; static TCHAR szOpenError[] = TEXT ("Error opening waveform audio!"); static TCHAR szMemError [] = TEXT ("Error allocating memory!") ;
const int BufferNum = 6; //-- 버퍼의 갯수
//-- Wave 재생시 Double Buffering구현을 위한 버퍼 static PBYTE pBuffer[6] ; static PWAVEHDR pWaveHdr[6] ;
//-- mmioRead 에서 파일 끝인지 아닌지 리턴값 저장 LONG mRet;
//-- Wave파일에서 버퍼마다 한번에 읽어 들일 크기 LONG read_size;
//-- 현재 MM_WOM_DONE : 진행상황 표시할때 쓸 변수 LONG CNT=0; char ca_CNTNUM[100];
//-- SineWave 좌/우 최대값 저장 LONG maxL, maxR; char L_MAX[10]; char R_MAX[10];
//-- 컬러 저장할 Color 선언 ( 초기화 - 파란색 ) COLORREF Color=RGB(200,255,255);
//-- 시간 관련 static HANDLE hTimer ; SYSTEMTIME st ;
//||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| //-- Global variable 선언 부분 끝--|| //|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| // || //-- int GET_READ_CHUNK ( OPENFILENAME OFN ) || //_________________________________________________________________|| // || //-- OPENFILENAME OFN - OFN.lpstrFile 로 전달 받은 파일의 위치에서 || // WAVE 파일의 Chunk 헤더를 읽는다 || // || //||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| int GET_READ_CHUNK ( OPENFILENAME OFN ) { // Open the wave file. hMMIO = mmioOpen(OFN.lpstrFile, NULL, MMIO_READ | MMIO_ALLOCBUF) ; if (hMMIO == NULL) return FALSE ;
// Descend into the RIFF chunk. mmCkInfoRIFF.fccType = mmioFOURCC ('W', 'A', 'V', 'E') ; if (mmioDescend(hMMIO, &mmCkInfoRIFF, NULL, MMIO_FINDRIFF) != MMSYSERR_NOERROR) return FALSE ;
// Descend into the format chunk. mmCkInfoChunk.ckid = mmioFOURCC ('f', 'm', 't', ' ') ; if (mmioDescend(hMMIO, &mmCkInfoChunk, &mmCkInfoRIFF, MMIO_FINDCHUNK) != MMSYSERR_NOERROR) return FALSE ;
// Read the format information into the WAVEFORMATEX structure. if (mmioRead ( hMMIO, (char *)&waveFormatEx, sizeof(WAVEFORMATEXTENSIBLE) ) == -1) return FALSE ;
// Ascend out of the format chunk. if (mmioAscend(hMMIO, &mmCkInfoChunk, 0) != MMSYSERR_NOERROR) return FALSE ;
// Descend into the data chunk. mmCkInfoChunk.ckid = mmioFOURCC ('d', 'a', 't', 'a') ; if (mmioDescend(hMMIO, &mmCkInfoChunk, &mmCkInfoRIFF, MMIO_FINDCHUNK) != MMSYSERR_NOERROR) return FALSE ;
// WAV 데이터의 크기를 저장해둔다. waveSize = mmCkInfoChunk.cksize ;
return TRUE ; }
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| // || // static cxClient, cyClient ; || // BOOL WM_SIZE_FUNCTION ( LPARAM lParam ) || //_________________________________________________________________|| // || // WM_SIZE : 윈도우 사이즈 크기가 바뀔때마다 크기정보를 얻는다. || // || //||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| static cxClient, cyClient ; BOOL WM_SIZE_FUNCTION ( LPARAM lParam ) { //static cxClient, cyClient ; // WM_PAINT 때문에 전역으로 빼돌림
cxClient = LOWORD ( lParam ) ; cyClient = HIWORD ( lParam ) ;
return TRUE ; }
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| //--연관된 함수 블록 시작--|| //|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| // || //-- int PLAY_BEG ( HWAVEOUT hWaveOut ) || //_________________________________________________________________|| // || //-- 재생 시작 기능 || // || //||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| int PLAY_BEG ( ) { return TRUE ; }
//||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| // || //-- int PLAY_PAUSE ( HWAVEOUT hWaveOut ) || //_________________________________________________________________|| // || //-- 재생 중 잠시 멈춤 기능 || // || //||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| int PLAY_PAUSE ( HWAVEOUT hWaveOut ) { // Pause or restart output if ( !bPaused ) { waveOutPause ( hWaveOut ) ; bPaused = TRUE ; } else if ( bPaused ) { waveOutRestart ( hWaveOut ) ; bPaused = FALSE ; //MessageBox(hwnd, "bPaused = FALSE", "Message", MB_OK ); }
return TRUE ; }
//||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| // || //-- int PLAY_END ( HWAVEOUT hWaveOut ) || //_________________________________________________________________|| // || //-- 재생 중지 || // || //||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| int PLAY_END ( HWAVEOUT hWaveOut ) { waveOutReset ( hWaveOut ) ; waveOutClose ( hWaveOut ) ;
bEnding = TRUE ;
return TRUE ; }
//||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| // || //-- int IDC_SET_MUTE_FUNCTION ( HWAVEOUT hWaveOut ) || //_________________________________________________________________|| // || //-- 음소거 || // || //||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| int IDC_SET_MUTE_FUNCTION ( HWAVEOUT hWaveOut ) { if (!bMute) { waveOutSetVolume( hWaveOut, 0x00000000); bMute = TRUE ; } else { waveOutSetVolume( hWaveOut, 0xFFFFFFFF); bMute = FALSE ; } return TRUE ; }
//||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| //--연관된 함수 블록 끝--|| //|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| // || //-- BOOL WAVE_BIT_CHECK () || //_________________________________________________________________|| // || //-- 20 Bit 인지 24 Bit 인지 판별해 낸다. || //-- 전역 waveFormatEx 를 사용하므로 인자는 없다. || // || //||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| BOOL WAVE_BIT_CHECK () { //-- 20 Bit 재생 if ( waveFormatEx.Format.wBitsPerSample == 20 ) { waveFormatEx.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE; waveFormatEx.Format.wBitsPerSample = 24; waveFormatEx.SubFormat = KSDATAFORMAT_SUBTYPE_PCM;
wsprintf ( ca_wBitsPerSample, "%d" , 20 ); }
//-- 24 Bit 재생 if ( waveFormatEx.Format.wBitsPerSample == 24 ) { waveFormatEx.Format.wFormatTag = WAVE_FORMAT_EXTENSIBLE; waveFormatEx.SubFormat = KSDATAFORMAT_SUBTYPE_PCM; //wsprintf(caBit, "%d", waveFormatEx.Format.wBitsPerSample ); waveFormatEx.dwChannelMask = SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT ; } return TRUE ; }
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| //--연관된 함수 블록 시작--|| //|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| // || // void GET_PEAK_MAX ( int bit, int isMonoStereo, void *buf, || // int bufsize, int *maxL, int *maxR ) || //_________________________________________________________________|| // || //--MM_WOM_DONE에서 호출 || // || //--현재 재생중인 사운드 Buffer의 좌/우 MAX 치를 구한다. || || // || //||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| void GET_PEAK_MAX (int bit,int isMonoStereo, void *buf, LONG bufsize, LONG *maxL, LONG *maxR ) {
//TODO: }
//||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| // || // BOOL GET_SINE_WAVE ( int bit, || // int isMonoStereo, || // void *buf, || // LONG bufsize ) || //_________________________________________________________________|| // || //--MM_WOM_DONE_FUNCTION에서 호출 || // || //--넘겨 받은 버퍼의 내용 -> 수치화된 값 조사 || // || //||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| #define NUM 1024
long ia_L_MAX[NUM] ; long ia_R_MAX[NUM] ;
BOOL GET_SINE_WAVE ( int bit,int isMonoStereo,void *buf,LONG bufsize) { BYTE *pB ; // 1 Byte (BYTE) short *pW ; // 2 Byte (WORD)
LONG i;
LONG cnt = bufsize / ( bit / 8 ) ; // 8:1, 16:2, 24:3, 32:4
cnt /= isMonoStereo ;
//-- 8 Bit if ( bit == 8 ) { pB = ( BYTE * ) buf ;
if ( isMonoStereo == 1 ) //-- Mono { for ( i = 0; i < NUM; i++ ) { ia_L_MAX[i] = (int) *pB / 2 ;
pB ++ ; } }
if ( isMonoStereo == 2 ) //-- Stereo { for ( i = 0; i < NUM; i++ ) { ia_L_MAX[i] = (int) *pB / 2 ; ia_R_MAX[i] = (int) *( pB + 1 ) / 2 ;
pB += 2 ; }
} }
//-- 16 Bit if ( bit == 16 ) { pW = ( short * ) buf ;
if ( isMonoStereo == 1 ) //-- Mono { for ( i = 0; i < NUM; i++ ) { ia_L_MAX[i] = (int) *pW / 0xff ;
pW ++ ; } }
if ( isMonoStereo == 2 ) //-- Stereo { for ( i = 0; i < NUM; i++ ) { ia_L_MAX[i] = (int) *pW / 0xff ; ia_R_MAX[i] = (int) *( pW + 1 ) / 0xff / 3 ;
pW += 2 ; } } }
return TRUE ; }
//-- Memory DC 설정 HDC MemDC ; HBITMAP OldBitMap ; HBITMAP MemBit ;
//||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| // || // BOOL DRAW_HORIZONTAL_LINE ( HWND hwnd, HDC hdc ) || //_________________________________________________________________|| // || // WM_PAINT 에서 호출 : 바탕화면에 수평으로 선을 그린다. || // || // 빠른 화면 갱신을 위해 MemoryDC 를 사용한다. || // || //||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| BOOL DRAW_HORIZONTAL_LINE ( HWND hwnd, HDC hdc ) { HPEN hpen, OldPen ;
//-- 한 가운데 hpen = CreatePen ( PS_DOT, 2, RGB ( 0, 0, 255 ) ) ; OldPen = ( HPEN ) SelectObject ( MemDC, hpen ) ;
MoveToEx ( MemDC, 0, cyClient / 2, NULL ) ; LineTo ( MemDC, cxClient, cyClient / 2 ) ;
SelectObject ( MemDC, OldPen ) ; DeleteObject ( hpen ) ;
//-- [ L ] 채널 hpen = CreatePen ( PS_SOLID, 1, RGB ( 255, 255, 255 ) ) ; OldPen =( HPEN ) SelectObject ( MemDC, hpen ) ;
MoveToEx ( MemDC, 0, cyClient / 4, NULL ) ; // 2/4 LineTo ( MemDC, cxClient, cyClient / 4 ) ; // 2/4
SelectObject ( MemDC, OldPen ) ; DeleteObject ( hpen ) ;
//-- PS_DOT가 제대로 나오게 하기 위해 사용 SetBkColor( MemDC, RGB(0,0,0) ); hpen = CreatePen ( PS_DOT, 1, RGB ( 255, 255, 255 ) ) ; OldPen =( HPEN ) SelectObject ( MemDC, hpen ) ;
MoveToEx ( MemDC, 0, cyClient / 8, NULL ) ; // 1/4 LineTo ( MemDC, cxClient, cyClient / 8 ) ; // 1/4
MoveToEx ( MemDC, 0, ( cyClient / 8 ) + ( cyClient / 4 ), NULL ) ; // 3/4 LineTo ( MemDC, cxClient, ( cyClient / 8 ) + ( cyClient / 4 ) ) ; // 3/4
SelectObject ( MemDC, OldPen ) ; DeleteObject ( hpen ) ;
//-- [ R ] 채널 hpen = CreatePen ( PS_SOLID, 1, RGB ( 255, 255, 255 ) ) ; OldPen =( HPEN ) SelectObject ( MemDC, hpen ) ;
MoveToEx ( MemDC, 0, ( cyClient / 2 ) + ( cyClient / 4 ), NULL ) ; // 2/4 LineTo ( MemDC, cxClient, ( cyClient / 2 ) + ( cyClient / 4 ) ) ; // 2/4
SelectObject ( MemDC, OldPen ) ; DeleteObject ( hpen ) ;
//-- PS_DOT가 제대로 나오게 하기 위해 사용 SetBkColor( MemDC, RGB(0,0,0) ); hpen = CreatePen ( PS_DOT, 1, RGB ( 255, 255, 255 ) ) ; OldPen =( HPEN ) SelectObject ( MemDC, hpen ) ;
MoveToEx ( MemDC, 0, ( cyClient / 2 ) + ( cyClient / 8 ), NULL ) ; // 1/4 LineTo ( MemDC, cxClient, ( cyClient / 2 ) + (cyClient / 8 ) ) ; // 1/4
MoveToEx ( MemDC, 0, ( cyClient / 2 ) + ( cyClient / 8 ) + ( cyClient / 4 ) , NULL ) ; // 3/4 LineTo ( MemDC, cxClient, ( cyClient / 2 ) + ( cyClient / 8 ) + ( cyClient / 4 ) ) ; // 3/4
SelectObject ( MemDC, OldPen ) ; DeleteObject ( hpen ) ;
return TRUE ; }
//||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| // || // BOOL DRAW_SINE_WAVE ( HWND hwnd ) || //_________________________________________________________________|| // || //--WM_PAINT : WM_PAINT에서 호출 || // || //--사인파형으로 그래프를 그린다. || // || //||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| #define TWOPI (2 * 3.14159) BOOL DRAW_SINE_WAVE ( HWND hwnd , HDC hdc, int iBitsPerSample, int iChannels ) //BOOL DRAW_SINE_WAVE ( HWND hwnd , int iBitsPerSample, int iChannels ) { // 이미 비트맵이 만들어져 있으면 지운다. if (MemBit) DeleteObject(MemBit);
MemBit = CreateCompatibleBitmap ( hdc, 1600, 1200) ; MemDC = CreateCompatibleDC ( hdc ) ; OldBitMap = ( HBITMAP ) SelectObject ( MemDC, MemBit ) ;
//-- Wave 의 색깔 지정 HPEN hpen, OldPen ; //hpen = CreatePen ( PS_SOLID, 1, RGB ( 0, 0, 255 ) ) ; hpen = CreatePen ( PS_SOLID, 1, Color ) ; OldPen =( HPEN ) SelectObject ( MemDC, hpen ) ;
POINT L_Point[NUM], R_Point[NUM] ;
//- [L] Chnnel for ( long iCnt = 0 ; iCnt < NUM; iCnt++ ) { L_Point[iCnt].x = iCnt * cxClient / NUM ;
//-- 8 Bit if ( iBitsPerSample == 8 ) { L_Point[iCnt].y = (int) ( ( cyClient / 6 ) + ( cyClient / 4 ) * (1 - sin (TWOPI * ia_L_MAX[iCnt] / NUM ) * 2 )) ; }
//-- 16Bit if ( iBitsPerSample == 16 ) { L_Point[iCnt].y = (int) ( ( cyClient / 4 ) * (1 - sin (TWOPI * ia_L_MAX[iCnt] / NUM))) ; } } Polyline ( MemDC, L_Point, NUM );
//-- Stereo 일때만 오른쪽 채널도 표시 if ( iChannels == 2 ) { //- [R] Chnnel for ( long iCnt = 0 ; iCnt < NUM; iCnt++ ) { R_Point[iCnt].x = iCnt * cxClient / NUM ;
//-- 8 Bit if ( iBitsPerSample == 8 ) { R_Point[iCnt].y = (int) ( ( cyClient / 6 ) + ( cyClient / 2 ) + ( cyClient / 4 ) * (1 - sin (TWOPI * ia_R_MAX[iCnt] / NUM ) * 2 )) ; }
//-- 16Bit if ( iBitsPerSample == 16 ) { R_Point[iCnt].y = (int) ( (( cyClient / 2 ) + ( cyClient / 4 )) * (1 - sin (TWOPI * ia_R_MAX[iCnt] / NUM))) ; } } Polyline ( MemDC, R_Point, NUM ); }
DRAW_HORIZONTAL_LINE ( hwnd, hdc) ;
SelectObject ( MemDC, OldPen ) ; DeleteObject ( hpen ) ;
return TRUE ; }
//||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| //--연관된 함수 블록 끝--|| //|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| //--연관된 함수 블록 시작--|| //|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| // || // BOOL WRITE_FILE_INFOMATION (WAVEFORMATEXTENSIBLE waveFormatEx) || //_________________________________________________________________|| // || // WM_PAINT 에서 호출 : 파일정보를 기록한다. || // || //||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| BOOL WRITE_FILE_INFOMATION ( WAVEFORMATEXTENSIBLE waveFormatEx ) { wsprintf ( ca_wFormatTag, "wFormatTag - %d", waveFormatEx.Format.wFormatTag ) ; wsprintf ( ca_nChannels, "nChannels - %d" , waveFormatEx.Format.nChannels ) ; wsprintf ( ca_nSamplesPerSec, "nSamplesPerSec - %d Hz" , waveFormatEx.Format.nSamplesPerSec ) ; wsprintf ( ca_nAvgBytesPerSec, "nAvgBytesPerSec - %d" , waveFormatEx.Format.nAvgBytesPerSec ) ; wsprintf ( ca_nBlockAlign, "nBlockAlign - %d" , waveFormatEx.Format.nBlockAlign ) ; wsprintf ( ca_wBitsPerSample, "wBitsPerSample - %d" , waveFormatEx.Format.wBitsPerSample ) ; wsprintf ( ca_cbSize, "cbSize - %d" , waveFormatEx.Format.cbSize ) ; wsprintf ( ca_lpstrFile, "File - %s" , OFN.lpstrFile ) ;
return TRUE ; }
//||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| // || // BOOL SHOW_FILE_INFOMATION ( HWND hwnd ) || //_________________________________________________________________|| // || // WM_PAINT 에서 호출 : 파일정보를 보여준다. || // || //||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| BOOL SHOW_FILE_INFOMATION ( HWND hwnd ) { HDC hdc ; hdc = GetDC ( hwnd) ;
TextOut ( hdc, 10, 20, ca_wFormatTag, strlen(ca_wFormatTag) ) ; TextOut ( hdc, 10, 40, ca_nChannels , strlen(ca_nChannels) ); TextOut ( hdc, 10, 60, ca_nSamplesPerSec , strlen(ca_nSamplesPerSec) ); TextOut ( hdc, 10, 80, ca_nAvgBytesPerSec, strlen(ca_nAvgBytesPerSec) ) ; TextOut ( hdc, 10, 100, ca_nBlockAlign, strlen(ca_nBlockAlign) ) ; TextOut ( hdc, 10, 120, ca_wBitsPerSample, strlen(ca_wBitsPerSample) ) ; TextOut ( hdc, 10, 140, ca_cbSize, strlen(ca_cbSize) ) ; TextOut ( hdc, 10, 160, ca_lpstrFile, strlen(ca_lpstrFile) ) ;
ReleaseDC ( hwnd, hdc ) ;
return TRUE ; }
//||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| // || // BOOL WM_PAINT_FUNCTION ( HWND hwnd ) || //_________________________________________________________________|| // || // WM_PAINT : WM_PAINT 메세지 처리 || // || //||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| BOOL WM_PAINT_FUNCTION ( HWND hwnd ) { HDC hdc ; PAINTSTRUCT ps ;
//-- Byte 단위의 값을 보여준다. //hdc = GetDC ( hwnd ) ; //SHOW_WAVE_DATA ( hwnd ,hdc ) ; //SHOW_WAVE_DATA ( hwnd ) ; //ReleaseDC ( hwnd, hdc ) ;
hdc = BeginPaint ( hwnd, &ps ) ;
DRAW_SINE_WAVE ( hwnd, hdc, waveFormatEx.Format.wBitsPerSample, waveFormatEx.Format.nChannels ) ;
BitBlt ( hdc, 0, 0, cxClient, cyClient , MemDC, 0, 0, SRCCOPY); SelectObject ( MemDC, OldBitMap ) ; DeleteDC ( MemDC ) ;
EndPaint ( hwnd, &ps ) ;
return TRUE ; }
//||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| //--연관된 함수 블록 끝--|| //|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| //--연관된 함수 블록 시작--|| //|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| // || //-- int MM_WOM_OPEN_FUNCTION ( HWAVEOUT hWaveOut, int BufferNum ) || //_________________________________________________________________|| // || //-- hWaveOut 과 BufferNum을 넘겨 받는다. || // - hWaveOut : hWaveOut 핸들 || // - BufferNum : 버퍼의 갯수 || // || //-- waveOutWrite : 버퍼 재생이 끝나면 MM_WOM_DONE: 메세지를 || // 발생시킨다. || // || //||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| int MM_WOM_OPEN_FUNCTION ( HWAVEOUT hWaveOut, int BufferNum ) { read_size = ( ( waveFormatEx.Format.nSamplesPerSec * waveFormatEx.Format.nChannels * ( waveFormatEx.Format.wBitsPerSample / 8 ) / 10 ) );
if( read_size ) { //MessageBox(hwnd, "MM_WOM_OPEN_FUNCTION ", "Message!", MB_OK);
for( int i=0; i < BufferNum; i++) { // Allocate memory for wave header pWaveHdr[i] = ( WAVEHDR * ) malloc ( sizeof (WAVEHDR) ) ;
pBuffer[i] = ( BYTE * ) malloc (read_size); pWaveHdr[i]->lpData = ( char * ) pBuffer[i] ; pWaveHdr[i]->dwBufferLength = read_size ; pWaveHdr[i]->dwFlags = WHDR_DONE;
mmioRead ( hMMIO, ( char * ) pBuffer[i], read_size );
waveOutPrepareHeader ( hWaveOut, pWaveHdr[i], sizeof (WAVEHDR) ) ; }
for( int j=0; j < BufferNum; j++) waveOutWrite (hWaveOut, pWaveHdr[j], sizeof (WAVEHDR)) ; } return TRUE ; }
//||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| // || //-- int MM_WOM_DONE_FUNCTION ( HWAVEOUT hWaveOut, int BufferNum ) || //_________________________________________________________________|| // || // || //||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| int MM_WOM_DONE_FUNCTION ( HWND hwnd, HWAVEOUT hWaveOut , int BufferNum ) { mRet = mmioRead ( hMMIO, ( char* ) pBuffer[CNT], read_size );
if ( ( mRet == -1 ) || ( mRet == 0 ) ) // 1 is Error || 0 is File End { waveOutClose ( hWaveOut ) ; return FALSE; }
waveOutWrite ( hWaveOut, pWaveHdr[CNT], sizeof ( WAVEHDR ) ) ;
GET_SINE_WAVE ( waveFormatEx.Format.wBitsPerSample, waveFormatEx.Format.nChannels, pBuffer[CNT], read_size ) ;
CNT++; CNT %= BufferNum ;
bEnding = FALSE ; bPlaying = TRUE ;
return TRUE ; }
//||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| // || //-- int MM_WOM_CLOSE_FUNCTION (HWAVEOUT hWaveOut, int BufferNum ) || //_________________________________________________________________|| // || // || //||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| int MM_WOM_CLOSE_FUNCTION ( HWAVEOUT hWaveOut, int BufferNum ) { for ( int i=0; i < BufferNum; i++ ) { waveOutUnprepareHeader ( hWaveOut, pWaveHdr[i], sizeof ( WAVEHDR ) ) ; free ( pWaveHdr[i] ) ; free ( pBuffer[i] ) ; } mmioClose ( hMMIO, 0 ) ;
bPaused = FALSE ; bPlaying = FALSE ; bEnding = TRUE ;
return TRUE ; }
//||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| //--연관된 함수 블록 끝--|| //|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| // || // int FILE_OPEN ( HWND hwnd, OPENFILENAME OFN ) || //_________________________________________________________________|| // || //--IDC_FILEOPEN 처리 부분 - 파일 정보를 읽어온다. || // || //||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| int FILE_OPEN ( HWND hwnd, OPENFILENAME OFN, HWAVEOUT hWaveOut ) { memset ( &OFN, 0, sizeof ( OPENFILENAME ) ) ; OFN.lStructSize = sizeof ( OPENFILENAME ) ; OFN.hwndOwner = hwnd ; OFN.lpstrFilter = "WAVE FILE (*.wav)\0*.wav\0" ; OFN.lpstrFile = caFileName ; OFN.nMaxFile = MAX_PATH ;
if ( GetOpenFileName(&OFN) != 0 ) { GET_READ_CHUNK (OFN) ; // 파일 정보를 읽어온다. WRITE_FILE_INFOMATION ( waveFormatEx ) ; // 파일 정보를 기록한다. SHOW_FILE_INFOMATION ( hwnd ) ; // 파일 정보를 보여준다.
if (bPlaying) { waveOutReset (hWaveOut) ; waveOutClose (hWaveOut) ; } //GET_READ_CHUNK(OFN) ;
HDC hdc ; hdc = GetDC (hwnd) ; TextOut ( hdc, 300, 300, caFileName, strlen ( caFileName ) ) ; ReleaseDC ( hwnd, hdc ) ; }
return TRUE ; }
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
BOOL WM_CREATE_FUNCTION ( HWND hwnd ) { SetScrollRange ( hwnd, SB_HORZ, 0, xMax, TRUE ) ; SetScrollPos ( hwnd, SB_HORZ, 0, TRUE ) ;
//--Timer hTimer = ( HANDLE ) SetTimer ( hwnd, 1, 10, NULL );
return 0 ; }
BOOL WM_TIMER_FUNCTION ( HWND hwnd ) { GetLocalTime ( &st ) ; //RedrawWindow( hwnd, NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE ) ;
if ( bPlaying ) InvalidateRect ( hwnd, NULL, FALSE ) ;
return 0 ; }
//||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| // || // LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) || // || //||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| LRESULT CALLBACK WndProc ( HWND hwnd, UINT iMessage, WPARAM wParam, LPARAM lParam ) { CHOOSECOLOR COL; static COLORREF crTemp[16];
switch ( iMessage ) { case WM_CREATE: WM_CREATE_FUNCTION ( hwnd ) ; return 0 ;
case WM_TIMER:
WM_TIMER_FUNCTION ( hwnd ) ; return 0 ;
case WM_RBUTTONDOWN: memset(&COL, 0, sizeof(CHOOSECOLOR)); COL.lStructSize = sizeof(CHOOSECOLOR); COL.hwndOwner=hwnd;
//-- Full Size 로 COL.Flags=CC_FULLOPEN;
COL.lpCustColors=crTemp; if (ChooseColor(&COL)!=0) { Color=COL.rgbResult; InvalidateRect(hwnd, NULL, TRUE); } return 0;
case WM_HSCROLL: switch (LOWORD(wParam)) { }
case WM_SIZE: WM_SIZE_FUNCTION ( lParam ) ; return 0 ;
case WM_PAINT: WM_PAINT_FUNCTION ( hwnd ) ; return 0 ;
case WM_COMMAND: switch ( LOWORD ( wParam ) ) { case IDC_FILEOPEN: //FILE_OPEN ( hwnd, OFN, hWaveOut) ; memset ( &OFN, 0, sizeof ( OPENFILENAME ) ) ; OFN.lStructSize = sizeof ( OPENFILENAME ) ; OFN.hwndOwner = hwnd ; OFN.lpstrFilter = "WAVE FILE (*.wav)\0*.wav\0" ; OFN.lpstrFile = caFileName ; OFN.nMaxFile = MAX_PATH ;
if ( GetOpenFileName(&OFN) != 0 ) { GET_READ_CHUNK (OFN) ;
if (bPlaying) { waveOutReset (hWaveOut) ; waveOutClose (hWaveOut) ; } //GET_READ_CHUNK(OFN) ; } return 0 ;
case IDC_FILEEXIT: PostQuitMessage ( 0 ) ; return 0 ;
case IDC_PLAY_BEG: GET_READ_CHUNK ( OFN ) ; WAVE_BIT_CHECK () ; //-- 20 , 24 Bit 판별
if ( waveOutOpen ( &hWaveOut, WAVE_MAPPER, (LPCWAVEFORMATEX) &waveFormatEx, (DWORD) hwnd, 0, CALLBACK_WINDOW) ) { MessageBeep (MB_ICONEXCLAMATION) ; MessageBox (hwnd, szOpenError, szAppName, MB_ICONEXCLAMATION | MB_OK) ; } bPlaying = TRUE ; return 0 ;
case IDC_PLAY_PAUSE: PLAY_PAUSE ( hWaveOut ) ; return 0 ;
case IDC_PLAY_END: PLAY_END ( hWaveOut ) ; return 0 ;
case IDC_SET_MUTE: IDC_SET_MUTE_FUNCTION ( hWaveOut ) ; return 0 ; } break; //-- InSide : case WM_COMMAND:
case MM_WOM_OPEN: MM_WOM_OPEN_FUNCTION ( hWaveOut, BufferNum ) ; return 0 ;
case MM_WOM_DONE: MM_WOM_DONE_FUNCTION ( hwnd, hWaveOut , BufferNum ) ; return 0 ;
case MM_WOM_CLOSE: MM_WOM_CLOSE_FUNCTION ( hWaveOut, BufferNum ) ; return 0 ;
case WM_DESTROY: //-- Timer KillTimer ( hwnd, 1 ) ; PostQuitMessage(0); return 0 ; }
return(DefWindowProc(hwnd,iMessage,wParam,lParam));
}
//=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| // || // WinMain() || // || //||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| int APIENTRY WinMain ( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdParam, int nCmdShow )
{ HWND hwnd; MSG Message; WNDCLASS WndClass; g_hInst=hInstance;
WndClass.cbClsExtra=0; WndClass.cbWndExtra=0; WndClass.hbrBackground=(HBRUSH)GetStockObject (BLACK_BRUSH); //(BLACK_BRUSH); //(LTGRAY_BRUSH); //(WHITE_BRUSH); WndClass.hCursor=LoadCursor(NULL,IDC_ARROW); WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION); WndClass.hIcon=LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1)); WndClass.hInstance=hInstance; WndClass.lpfnWndProc=(WNDPROC)WndProc; WndClass.lpszClassName=szAppName; //WndClass.lpszMenuName=NULL; WndClass.lpszMenuName=MAKEINTRESOURCE(IDR_MAIN_MENU); WndClass.style=CS_HREDRAW | CS_VREDRAW; RegisterClass(&WndClass);
hwnd=CreateWindow ( szAppName , szAppName , WS_OVERLAPPEDWINDOW | WS_HSCROLL | WS_EX_CLIENTEDGE | WS_EX_ACCEPTFILES // WS_POPUPWINDOW , 0 , 0 , 800 //-- 800 * 600 Mode 에 최적화 , 600 , NULL , (HMENU) NULL , hInstance , NULL ) ;
// ShowWindow ( hwnd, nCmdShow ) ; ShowWindow ( hwnd, SW_SHOWMAXIMIZED ) ; // 시작하자 마자 창 최대화 크기로.. //UpdateWindow (hwnd) ;
while ( GetMessage ( &Message, 0, 0, 0 ) ) { TranslateMessage ( &Message ) ; DispatchMessage ( &Message ) ; } return Message.wParam ; } | ||||
|
| ||||||||||||||||
| ||||||||||||||||
|
'- 음악과 나 - > 『 짬 통 』' 카테고리의 다른 글
전체화면으로 전환 (0) | 2006.05.18 |
---|---|
fps 계산하기 (0) | 2006.05.18 |
사각영역에 숨겨진 작은 비밀 (0) | 2006.05.18 |
bit를 이해하자 (0) | 2006.05.18 |
배열과 포인터는 전혀 다르다 (0) | 2006.05.18 |