WAVE WAVE RIFF Resource Interchange File Format RIFF

  • Slides: 16
Download presentation

WAVE 파일 구조 웨이브(WAVE)파일은 사운드 데이터가 RIFF (Resource Interchange File Format)방식 으로 저장 RIFF방식이란

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.

사용 절차 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;

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;

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.

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

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(. . )함수로 사운드 버퍼를 생성하고 난

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(. . )�� �� 된

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; }

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 );