WAVE WAVE RIFF Resource Interchange File Format RIFF
















- Slides: 16
WAVE 파일 구조 웨이브(WAVE)파일은 사운드 데이터가 RIFF (Resource Interchange File Format)방식 으로 저장 RIFF방식이란 사운드나 비디오처럼 용량이 큰 데이터를 블록(청크: Chunk)단위로 나누 어 저장하는 것 � � 바이트 수 wave. RIFFChunk 4 "RIFF" wave. Size 4 현재 위치부터 파일의 �� : 파일의 �� -4 wave. WAVEChunk 4 “WAVE" wave. FMTChunk 4 "fmt“ wave. Format. Size 4 �� 브 �� ��� : 16 wave. PCMFormat. Flag 2 PCM �� : 1 wave. Channel 2 �� : 1 �� �� 레오 : 2 wave. Sample. Rate 4 �플링 수 wave. Sample. Rate. Per. Sec 4 초당 전송되는 바이트 수 wave. Per. Sec. Scale 2 �플링 바이트 수 wave. Bits 2 �� 수 wave. DATAChunk 4 “data" wave. DATASize 4 ���� �� ���
사용 절차 Direct. Sound 객체 생성 HRESULT WINAPI Direct. Sound. Create 8( LPCGUID lpc. Guid. Device, LPDIRECTSOUND 8 * pp. DS 8, LPUNKNOWN p. Unk. Outer ); lpc. Guid. Device : 사운드 장치에 대한 GUID의 주소 값 기본 장치를 사용하기 위해서는 NULL 값을 사용 pp. DS 8 : Direct. Sound. Create 8(. . )함수를 통해 생성된 Direct. Sound 객체를 얻어오기 위한 포인터 p. Unk. Outer : NULL을 사용
Mouse Input Direct. Sound 객체 생성 예 HRESULT hr; LPDIRECTSOUND 8 p. Dx. Sound; //Direct. Sound 객체. if( FAILED( hr = Direct. Sound. Create 8( NULL, &p. Dx. Sound, NULL ) ) ) { Output. Debug. String("Direct. Sound 객체 ���� 수 ����. n"); return FALSE; }
Mouse Input Direct. Sound 버퍼 HRESULT hr; LPDIRECTSOUNDBUFFER p. DSBPrimary = NULL; DSBUFFERDESC dsbd; Zero. Memory( &dsbd, sizeof(DSBUFFERDESC) ); dsbd. dw. Size = sizeof(DSBUFFERDESC); dsbd. dw. Flags = DSBCAPS_PRIMARYBUFFER; dsbd. dw. Buffer. Bytes = 0; dsbd. lpwfx. Format = NULL; // p. Dx. Sound�Direct. Sound. Create 8(. . )� � �� 된 Direct. Sound 객체. if( FAILED( hr = p. Dx. Sound>Create. Sound. Buffer( &dsbd, &p. DSBPrimary, NULL ) ) ) {
Mouse Input typedef struct { WORD w. Format. Tag; WORD n. Channels; DWORD n. Samples. Per. Sec; DWORD n. Avg. Bytes. Per. Sec; WORD n. Block. Align; WORD w. Bits. Per. Sample; WORD cb. Size; } WAVEFORMATEX; w. Format. Tag : 사운드 데이터의 포맷으로 1채널이나 2채널의 PCM 사운드 데이터를 사용할 경우 WAVE_FORMAT_PCM을 사용 n. Channels : 사운드 데이터의 채널수를 지정. 이 값이 1이면 모노, 2이면 스테레오 n. Samples. Per. Sec : 초당 샘플링 수(Hz)로 일반적인 값은 8. 0 k. Hz, 11. 025 k. Hz, 22. 05 k. Hz, 및 44. 1 k. Hz. w. Bits. Per Sample : 샘플 당 비트수로 8비트나 16비트 값을 사용 n. Avg. Bytes. Per. Sec : 초당 전송될 바이트 수로 n. Block. Align * n. Samples. Per. Sec n. Block. Align : 샘플 당 바이트 수로 n. Channels * w. Bits. Per. Sample / 8 cb. Size : 추가되는 정보의 바이트 수로 이 값은 0을 사용
Mouse Input 1차 사운드 버퍼(Primary Buffer)의 포맷 변경 예 #define CHANNEL 2 #define SAMPLESPERSEC 22050 #define BITSPERSAMPLE 16 HRESULT hr; WAVEFORMATEX wfx; Zero. Memory( &wfx, sizeof(WAVEFORMATEX) ); wfx. w. Format. Tag = WAVE_FORMAT_PCM; wfx. n. Channels = (WORD) CHANNEL; wfx. n. Samples. Per. Sec = SAMPLESPERSEC; wfx. w. Bits. Per. Sample = (WORD) BITSPERSAMPLE; wfx. n. Block. Align = (WORD) (wfx. w. Bits. Per. Sample / 8 * wfx. n. Channels); wfx. n. Avg. Bytes. Per. Sec = wfx. n. Samples. Per. Sec * wfx. n. Block. Align; //p. DSBPrimary� Create. Sound. Buffer(. . )�수로 �� 된 1���� ��. if( FAILED( hr = p. DSBPrimary>Set. Format(&wfx) ) ) { Output. Debug. String("�����정할수 ��� �. n"); return FALSE;
Mouse Input 2차 사운드 버퍼생성 Create. Sound. Buffer(. . )함수로 사운드 버퍼를 생성하고 난 후, 생성된 버퍼에 Lock(. . )을 걸 고 웨이브(WAVE)데이터를 버퍼로 로드하고, 마지막으로 버퍼를 Unlock(. . ) 2차 버퍼를 생성하는데 허용된 최소 사이즈와 최대 사이즈는 dsound. h에 DSBSIZE_MIN 와 DSBSIZE_MAX로 정의 HRESULT hr; DWORD dw. DSBuffer. Size; LPDIRECTSOUNDBUFFER p. Sound. Buff; CWave wav_sound; wav_sound. Open(“back. wav"); dw. DSBuffer. Size = wav_sound. Get. Size(); DSBUFFERDESC dsbd; Zero. Memory( &dsbd, sizeof(DSBUFFERDESC) ); dsbd. dw. Size = sizeof(DSBUFFERDESC); dsbd. dw. Flags = DSBCAPS_STATIC; dsbd. dw. Buffer. Bytes = dw. DSBuffer. Size; dsbd. lpwfx. Format = wav_sound. m_pwfx;
2차 사운드 버퍼생성 // p. Dx. Sound�Direct. Sound. Create 8(. . )�� �� 된 Direct. Sound 객체. hr = p. Dx. Sound->Create. Sound. Buffer( &dsbd, &p. Sound. Buff, NULL ); if( FAILED(hr) ) { Output. Debug. String("��� ��� 수 ����. n"); return FALSE; } // Lock 된 ���. VOID* p. DSLocked. Buffer = NULL; // Lock 된 ���. DWORD dw. DSLocked. Buffer. Size = 0; // �� 브(WAVE)파일로부터 �� ��. DWORD dw. Wav. Data. Read = 0; if( FAILED( hr = p. Sound. Buff->Lock( 0, dw. DSBuffer. Size, &p. DSLocked. Buffer, &dw. DSLocked. Buffer. Size, NULL, 0 L ) ) )
2차 사운드 버퍼생성 { Output. Debug. String("������Lock � 수 ����. n"); return FALSE; } if( FAILED( hr = wav_sound. Read( (BYTE*) p. DSLocked. Buffer, dw DSLocked. Buffer. Size, &dw. Wav. Data. Read ))) { Output. Debug. String("�����수 � ���. n"); p. Sound. Buff->Unlock( p. DSLocked. Buffer, dw. DSLocked. Buffer. Size, NULL, 0 ); return FALSE; 위의 소스에서는 2차 버퍼를 스태틱으로 생성하기 위해서 dsbd. dw. Flags를 } DSBCAPS_ STATIC으로 지정. m_p. Sound. Buff->Unlock( dsbd. dw. Buffer. Bytes는 1차 버퍼와는 달리 생성하고자 하는 버퍼의 크기를 지정 p. DSLocked. Buffer, dw. DSLocked. Buffer. Size, NULL, 0 );