Download presentation
Presentation is loading. Please wait.
1
DirectX Audio 2002년 3월 최윤석 작성
2
Concepts of DirectX Audio
Direct Sound Windows에서 사용할 수 있는 모든 사운드 카드에서 사운드를 재생할 수 있는 하나의 API. DirectX 6.1에서는 응용 프로그램이 게임의 음악을 동적으로 재생할 수 있도록 하는 DirectMusic이라는 새로운 요소 추가.
3
New in DirectX Audio Integration of waves and message-based sounds in a single playback mechanism More flexible and powerful audiopath model 다이렉트 뮤직은 MIDI 출력 외의 사운드까지도 처리. DLS2 Synthesis 시간을 조절하며 음악과 사운드를 재생하기 때문에 어떤 기종에서도 화면과 일치하는 연주 제공. Special effects 여러 가지 사운드에 특수 효과 제공 크리에이티브의 EAX와 비슷한 기능인데, 실제로 그것의 기술을 도입 Audio scripting 오디오에도 스크립트 언어를 썼는데, 이를 이용해 좀더 인터랙티브한 음악을 삽입
4
The Power of DirectX Audio
Wave, MIDI 파일 연주 여러 개의 음원의 동시 연주. Schedule the timing of musical events with high precision. Send tempo changes, patch changes, and other MIDI events programmatically. Use Downloadable Sounds. Locate sounds in a 3-D environment. Easily apply pitch changes, reverb, and other effects to sounds. Use more than 16 MIDI channels. Capture MIDI data or stream ("thru") it from one port to another. Capture wave sounds from a microphone or other input.
5
Using DirectSound IDirectSound8 IDirectSoundBuffer8
IDirectSound3DBuffer8 IDirectSound3DListener8 IDirectSoundCapture8 IDirectSoundCaptureBuffer8 IDirectSoundNotify8 IKsProPertySet IDirectSound 사운드 카드의 기능을 결정하고 재생용 버퍼를 생성. IDirectSoundBuffer 재생 가은한 사운드 데이터를 유지할 데이터 버퍼 IDirectSound3DBuffer 3D 사운드를 보관할 버퍼, 거리, 위치, 투시 원뿔 등과 같은 추가 정보를 갖는다. IDirectSound3DListener 3D 수신자를 표현할 때 사용되는 개체, 3D 공간에서는 청취자의 위치와 방향에 따라 3D 버퍼가 서로 다른 사운드를 만든다. IDirectSoundCapture 캡쳐 버퍼를 생성하는데 사용되는 응용 프로그램 IDirectSoundCaptureBuffer 마이크와 같은 장치에서 녹음된 사운드 데이터를 보관하는데 사용되는 버퍼 IDirectSoundNotify 사운드 재생이 완료되었음을 응용 프로그램에게 알리는 기능을 가진 개체. IKsProPertySet 사양을 확장하지 않고도 드라이버에 특별한 기능들을 추가할 수 있도록 하는 사운드 제조업체에서 사용하는 인터페이스.
6
DirectSound Buffer DirectSound 주요도구 두가지 버퍼
Primary Buffer(오직 하나) 현재 사운드 카드에서 재생되는 사운드 Secondary Buffers 응용 프로그램에서 재생하려는 각 사운드 효과마다 하나의 보조 버퍼가 존재. 보조 버퍼는 주버퍼와 결합되어 사운드로 출력. 믹서를 사용하면 한번에 여러 개의 사운드 효과 출력 가능. 사운드 버퍼는 DirectDraw 버퍼와 매우 유사하나, 사운드 버퍼는 개념적으로 순환구조를 지닌다.
7
DirectSound 구조 Mixer Secondary Buffer Audio Mixer Primary Buffer
Hardware device Speaker
8
DirectSound System Architecture
9
DirectSound 구현 DirectX SDK에서 WAV 파일을 로드하고, DirectSound 버퍼를 만드는 코드를 제공.
구현 순서 DirectSound 개체 생성. Cooperative Level 설정 Primary Buffer 생성 Primary buffer에 사운드 데이터를 채움 Lock, Unlock Play
10
Creating a DirectSound Object
HRESULT WINAPI DirectSoundCreate8 ( LPCGUID lpcGuid, LPDIRECTSOUND8 *ppDS, LPUNKNWON pUnkOuter }; LPDIRECTSOUND8 pDSound = NULL; HRESULT hr = DirectSoundCreate (NULL, &pDSound, NULL); If (FAILED(hr)) { …… }
11
Set Coopreative Level HRESULT IDirectSound8::SetCooperativeLevel (
HWND hwnd, DWORD dwLevel }; dwLevel DSSCL_EXCLUSIVE DSSCL_NORMAL DSSCL_PRIORITY DSSCL_WIRTEPRIMARY DSSCL_EXCLUSIVE 사운드 카드의 배타적 제어을 얻는다. DSSCL_NORMAL 가장 원활하지만 가장 제한적인 협력 수준이다. 주 형식은 변경될 수 없다. DSSCL_PRIORITY 사운드 버퍼의 주형식이 변경될 수 있다. DSSCL_WIRTEPRIMARY 응용 프로그램이 가질 수 있는 최고 우선 순위. 어떠한 보조 버퍼도 재생될 수 없으며 주 버퍼의 비트를 직접 세분화하는 기능이 있다. HRESULT hr = pDSound->SetCooperativeLevel (hWnd, DSSCL_PRIORITY); If (FAILED(hr)) { ……………. };
12
Getting Primary Buffer
LPDIRECTSOUNDBUFFER pDSBPrimary = NULL; HRESULT hr = pDSound->CreateSoundBuffer (&dsbd, &pDSPrimary, NULL); if (FAILED(hr)) { ……………. }; WAVEFORAMTEX wfx; ZeroMemory(&wfx, sizeof(WAVEFORAMTEX)); wfx.wf.wFormatTag = WAVE_FORMAT_PCM ; wfx.wf.nChannels = bStereo ? 2 : 1 ; wfx.wf.nSamplesPerSec = dwFreq ; wfx.wf.nBlockAlign = (WORD)dwBlkAlign ; wfx.wf.nAvgBytesPerSec = wfx.wf.nSamplesPerSec * wfx.wf.nBlockAlign ; wfx.wBitsPerSample = (WORD)dwBitsPerSample ; HRESULT hr = pDSBPrimary->SetFormat(&wfx); dwSize 구조체의 크기 dwFlags DSBCAPS_CTRL3D : 버퍼에서 3D 컨트롤 필요 DSBCAPS_CTRLFREQUENCY : 주파수제어 기능을 필요 DSBCAPS_CTRLPAN : 패닝 조절 기능이 필요. DSBCAPS_CTRLPOSITIONNOTIFY : 위치 통보를 필요로 한다. DSBCAPS_CTRLVOLUME : 버퍼에서 볼륨 조절 기능을 필요로 한다. DSBCAPS_GETCURRENTPOSITION2 : GetCurrentPostion2를 호출할 때는 실제로 읽혀지는 곳에 읽기 위치를 배치하는 새로운 작동 밥법. DSBCAPS_GLBALFOCUS : 하드웨어/소프트 웨어 제쟁 지정. DSBCAPS_LOCDEFFER : 하드웨어에서 버퍼가 혼합. DSBCAPS_LOCHARDWARE : DSBCAPS_LOCSOFTWARE : 버퍼와 소프트웨어에서 혼합 DSBCAPS_MUTE3DATMAXDISTANCE : D3D Sound에서 3D 사운드 버퍼에 적용. DSBCAPS_PRIMARYBUFFER : 버퍼가 사운드 가드에 대해 오직 하나의 주버퍼임을 알려준다. DSBCAPS_STATIC : 버퍼가 한 번 재워지고 여러 번 재생할 것임을 드라이버에게 통보. DSBCAPS_STICKFOCUS : 사운드 버퍼의 초점 작동을 변경. dwBufferBytes; dwReserved; lpwfxFormat; 버퍼에서 웨이브 형식의 데이터를 설명하는 WAVEFORMATEX 구조체의 포인터 gurid3DAlgorithm;
13
DirectSound Buffer typedef struct { DWORD dwSize; DWORD dwFlags;
DWORD dwBufferBytes; DWORD dwReserved; LPWAVEFORMATEX lpwfxFormat; GUID gurid3DAlgorithm; } DSBUFFERDESC, *LPDSBUFFERDESC; dwFlags DSBCAPS_CTRL3D, DSBCAPS_CTRLFREQUENCY DSBCAPS_CTRLPAN, DSBCAPS_CTRLPOSITIONNOTIFY DSBCAPS_CTRLVOLUME, DSBCAPS_GETCURRENTPOSITION2 DSBCAPS_GLBALFOCUS, DSBCAPS_LOCDEFFER DSBCAPS_LOCHARDWARE, DSBCAPS_LOCSOFTWARE DSBCAPS_MUTE3DATMAXDISTANCE, DSBCAPS_PRIMARYBUFFER, DSBCAPS_STATIC, DSBCAPS_STICKFOCUS dwSize 구조체의 크기 dwFlags DSBCAPS_CTRL3D : 버퍼에서 3D 컨트롤 필요 DSBCAPS_CTRLFREQUENCY : 주파수제어 기능을 필요 DSBCAPS_CTRLPAN : 패닝 조절 기능이 필요. DSBCAPS_CTRLPOSITIONNOTIFY : 위치 통보를 필요로 한다. DSBCAPS_CTRLVOLUME : 버퍼에서 볼륨 조절 기능을 필요로 한다. DSBCAPS_GETCURRENTPOSITION2 : GetCurrentPostion2를 호출할 때는 실제로 읽혀지는 곳에 읽기 위치를 배치하는 새로운 작동 밥법. DSBCAPS_GLBALFOCUS : 하드웨어/소프트 웨어 제쟁 지정. DSBCAPS_LOCDEFFER : 하드웨어에서 버퍼가 혼합. DSBCAPS_LOCHARDWARE : DSBCAPS_LOCSOFTWARE : 버퍼와 소프트웨어에서 혼합 DSBCAPS_MUTE3DATMAXDISTANCE : D3D Sound에서 3D 사운드 버퍼에 적용. DSBCAPS_PRIMARYBUFFER : 버퍼가 사운드 가드에 대해 오직 하나의 주버퍼임을 알려준다. DSBCAPS_STATIC : 버퍼가 한 번 재워지고 여러 번 재생할 것임을 드라이버에게 통보. DSBCAPS_STICKFOCUS : 사운드 버퍼의 초점 작동을 변경. dwBufferBytes; dwReserved; lpwfxFormat; 버퍼에서 웨이브 형식의 데이터를 설명하는 WAVEFORMATEX 구조체의 포인터 gurid3DAlgorithm;
14
DirectSound Buffer typedef struct { WORD wFormatTag; WORD nChannels;
DWORD nSamplesPerSec; DWORD nAvgBytesPerSec; WORD nBlockAlign; WORD wBitsPerSample; WORD cbSize; } WAVEFORMATEX; WAVEFORAMTEX wfx; ZeroMemory(&wfx, sizeof(WAVEFORAMTEX)); wfx.wf.wFormatTag = WAVE_FORMAT_PCM ; wfx.wf.nChannels = bStereo ? 2 : 1 ; wfx.wf.nSamplesPerSec = dwFreq ; wfx.wf.nBlockAlign = (WORD)dwBlkAlign ; wfx.wf.nAvgBytesPerSec = pcmwf.wf.nSamplesPerSec * pcmwf.wf.nBlockAlign ; pcmwf.wBitsPerSample = (WORD)dwBitsPerSample ; dwSize 구조체의 크기 dwFlags DSBCAPS_CTRL3D : 버퍼에서 3D 컨트롤 필요 DSBCAPS_CTRLFREQUENCY : 주파수제어 기능을 필요 DSBCAPS_CTRLPAN : 패닝 조절 기능이 필요. DSBCAPS_CTRLPOSITIONNOTIFY : 위치 통보를 필요로 한다. DSBCAPS_CTRLVOLUME : 버퍼에서 볼륨 조절 기능을 필요로 한다. DSBCAPS_GETCURRENTPOSITION2 : GetCurrentPostion2를 호출할 때는 실제로 읽혀지는 곳에 읽기 위치를 배치하는 새로운 작동 밥법. DSBCAPS_GLBALFOCUS : 하드웨어/소프트 웨어 제쟁 지정. DSBCAPS_LOCDEFFER : 하드웨어에서 버퍼가 혼합. DSBCAPS_LOCHARDWARE : DSBCAPS_LOCSOFTWARE : 버퍼와 소프트웨어에서 혼합 DSBCAPS_MUTE3DATMAXDISTANCE : D3D Sound에서 3D 사운드 버퍼에 적용. DSBCAPS_PRIMARYBUFFER : 버퍼가 사운드 가드에 대해 오직 하나의 주버퍼임을 알려준다. DSBCAPS_STATIC : 버퍼가 한 번 재워지고 여러 번 재생할 것임을 드라이버에게 통보. DSBCAPS_STICKFOCUS : 사운드 버퍼의 초점 작동을 변경. dwBufferBytes; dwReserved; lpwfxFormat; 버퍼에서 웨이브 형식의 데이터를 설명하는 WAVEFORMATEX 구조체의 포인터 gurid3DAlgorithm;
15
DirectSound Buffer Handling
HRESULT IDirectSoundBuffer8::Play( DWORD dwReserved1, DWORD dwPriority, DWORD dwFlags }; HRESULT IDirectSoundBuffer8::Stop(); dwFlags DSBPLAY_LOOPING DSBPLAY_LOCHARDWARE DSBPLAY_LOCSOFTWARE DSBPLAY_TERMNATEBY_TIME DSBPLAY_ TERMNATEBY_DISTANCE DSBPLAY_ TERMNATEBY_PRIORITY DSBPLAY_LOOPING DSBPLAY_LOCHARDWARE DSBPLAY_LOCSOFTWARE DSBPLAY_TERMNATEBY_TIME DSBPLAY_ TERMNATEBY_DISTANCE DSBPLAY_ TERMNATEBY_PRIORITY
16
DirectSound Buffer Handling
HRESULT IDirectSoundBuffer8::Lock ( DWORD dwWriteCursor, DWORD dwWriteBytes, LPVOID lplpvAudioPtr1, LPDWORD lpdwAudioBytes1, LPVOID lplpvAudioPtr2, LPDWORD lpdwAudioBytes2, DWORD dwFlags }; HRESULT IDirectSoundBuffer8::Unlock ( LPVOID lplpvAudioPtr1, LPDWORD lpdwAudioBytes1, lpdwStatus DSBLOCK_FROMWIRTECURSOR DSBLOCK_ENTIREBUFFER dwWriteCursor 버퍼의 시작점에서 잠금이 시작되어야 하는 곳까지의 오프셋 dwWriteBytes 잠금을 설정해야 하는 바이트수 lplpvAudioPtr1 요청했던 잠금의 데이터 포인터로 채워질 포인터 lpdwAudioBytes1 첫번째 데이터 블록의 바이트 수로 재워질 포인터 lplpvAudioPtr2 요청했던 잠금의 보조 데이터 포인터로 채워질 포인터 lpdwAudioBytes2 두번째 데이터 블록의 바이트 수로 재워질 포인터 dwFlags DSBLOCK_FROMWIRTECURSOR 버퍼에 있는 현재 쓰기 커서부터 잠근다. DSBLOCK_ENTIREBUFFER 전체 사운드 버퍼를 잠근다.
17
DirectSound Buffer Handling
HRESULT IDirectSoundBuffer8::GetStatus( LPDWORD lpdwStatus }; lpdwStatus DSBSTATUS_BUFFERLOST DSBSTATUS_LOOPING DSBSTATUS_PLAYING DSBSTATUS_LOCSOFTWARE DSBSTATUS_ LOCHARDWARE DSBSTATUS_TERMINATED DSBSTATUS_BUFFERLOST DSBSTATUS_LOOPING DSBSTATUS_PLAYING DSBSTATUS_LOCSOFTWARE DSBSTATUS_ LOCHARDWARE DSBSTATUS_TERMINATED
18
Tutorial : Playing Audio Files
Step 1: Initialize Step 2: Load a File Step 3: Play the File Step 4: Close Down
19
Playing Audio Files #define INITGUID #include <dmusici.h>
// The tutorial uses three interface pointers, which are declared as follows: IDirectMusicLoader8* g_pLoader = NULL; IDirectMusicPerformance8* g_pPerformance = NULL; IDirectMusicSegment8* g_pSegment = NULL; // All the code in this simple application is included in the WinMain function. // The application has no main window, so it can proceed straight to the creation of // COM and two objects: the loader and the performance:. INT WinMain( HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine, INT nCmdShow ) { CoInitialize(NULL);
20
Initialize CoInitialize(NULL);
CoCreateInstance(CLSID_DirectMusicLoader, NULL, CLSCTX_INPROC, IID_IDirectMusicLoader8, (void**)&g_pLoader); CoCreateInstance(CLSID_DirectMusicPerformance, NULL, CLSCTX_INPROC, IID_IDirectMusicPerformance8, (void**)&g_pPerformance ); g_pPerformance->InitAudio( NULL, // IDirectMusic interface not needed. NULL, // IDirectSound interface not needed. NULL, // Window handle. DMUS_APATH_SHARED_STEREOPLUSREVERB, // Default audiopath type. 64, // Number of performance channels. DMUS_AUDIOF_ALL, // Features on synthesizer. NULL // Audio parameters; use defaults. );
21
// Find the Windows media directory.
CHAR strPath[MAX_PATH]; GetWindowsDirectory( strPath, MAX_PATH ); strcat( strPath, "\\media" ); // Convert to Unicode. WCHAR wstrSearchPath[MAX_PATH]; MultiByteToWideChar( CP_ACP, 0, strPath, -1, wstrSearchPath, MAX_PATH ); // Set the search directory. g_pLoader->SetSearchDirectory( GUID_DirectMusicAllTypes, // Types of files sought. wstrSearchPath, // Where to look. FALSE // Don't clear object data. );
22
WCHAR wstrFileName[MAX_PATH] = L"The Microsoft Sound.wav";
if (FAILED(g_pLoader->LoadObjectFromFile( CLSID_DirectMusicSegment, // Class identifier. IID_IDirectMusicSegment8, // ID of desired interface. wstrFileName, // Filename. (LPVOID*) &g_pSegment // Pointer that receives interface. ))) { MessageBox( NULL, "Media not found, sample will now quit.", "DMusic Tutorial", MB_OK ); return 0; } g_pSegment->Download( g_pPerformance );
23
g_pPerformance->PlaySegmentEx(
g_pSegment, // Segment to play. NULL, // Used for songs; not implemented. NULL, // For transitions. 0, // Flags. 0, // Start time; 0 is immediate. NULL, // Pointer that receives segment state. NULL, // Object to stop. NULL // Audiopath, if not default. ); MessageBox( NULL, "Click OK to Exit.", "Play Audio", MB_OK ); g_pPerformance->Stop( NULL, // Stop all segments. NULL, // Stop all segment states. 0, // Do it immediately. 0 // Flags.
24
g_pPerformance->CloseDown();
g_pLoader->Release(); g_pPerformance->Release(); g_pSegment->Release(); CoUninitialize(); return 0; // Return value for WinMain. }
Similar presentations