DirectX Audio 2002년 3월 최윤석 작성.

Slides:



Advertisements
Similar presentations
/11 CUDA 를 이용한 병렬 프로그래밍 DirectX 3D 를 이용한 3D 프로그래밍
Advertisements

Computer Graphics 윈도우 프로그래밍 김 창 헌김 창 헌. Computer Graphics 2 윈도우 시스템  윈도우  스크린 위에서 독립적으로 움직일 수 있는 사각형 영역  윈도우 시스템  유저와 어플리케이션간의 그래픽 스크린을 통한 인터페이스 를.
강의 내용 : DirectX 개요 DirectX 9 을 이용한 시각화. 목 차 DirectX 출현 배경 DirectX 현재 버전 DirectX 장점 DirectX 구성요소 DirectX SDK 다운로드 및 설치 DirectX SDK 폴더 구성 및 역할 샘플 코드 브라우저.
땅 따먹기 박중규,나민하 나와 바~악!.
ZX Smart Sensor 매뉴얼 韓國OMRON(株) 기술영업부 ZX-LDA11 (앰프) ZX-LD40 (헤더)
DB2 Information Management DB2 UDB CLP Command Summary.
C++ Tutorial 1 서강대학교 데이터베이스 연구실.
Mar OSEK/VDK Woo Dong Kyun.
Project #2-2. Pintos User Program
Chapter 7 ARP and RARP.
SYSTEM CALL (Syscall) CSLAB SEWON PARK.
윈도우 운영체제와 윈도우 응용 프로그램의 특징을 이해한다.
C++ Espresso 제1장 기초 사항.
제1장 윈도우 프로그래밍 1.1 윈도우 프로그래밍의 개념 1.2 윈도우 프로그램의 기본 구조
사용자 메뉴얼 차량용 4CH 블랙박스 매뉴얼 버전 : Version 2.1 Hardware Version : 2.0
사용자 메뉴얼 차량용 4CH 블랙박스 매뉴얼 버전 : Version 1.1 Hardware Version : 1.0
방송접목형 참여형방송기술 ETRI Technology Marketing Strategy IT R&D Global Leader
C 프로그래밍 소개 숙명여대 창병모 2011 가을.
Chapter 4. Fundamental File Structure Concepts
Multimedia Programming 17: Introduction to DirectShow
JDBC 프로그래밍 이수지 이동주 1.
System Call Linux Kernel 수업 3번째.
제 6 장 데이터 타입 6.1 데이터 타입 및 타입 정보 6.2 타입의 용도 6.3 타입 구성자 6.4 사례 연구
7장 : 캐시와 메모리.
 midi LOGGER GL220   신제품 소개 Dec, 2011.
Internet Computing KUT Youn-Hee Han
12. 데이터베이스 설계.
Kasimov C언어 세미나 1st.
InstallShield Professional Services ( Services Pack / Education / Consulting ) ㈜소프트뱅크 커머스.
안녕하십니까? 저는 컴퓨터 응용과학부 98학번 이민호 입니다.
Chapter 11. Raw 소켓.
CHAP 3:배열, 구조체, 포인터.
디지털 녹음장비 제 안 서 휴 코 산 업.
Ch2-2. VHDL Basic VHDL lexical element VHDL description
Multimedia Programming 18: GraphEditor
Embedded System Porting (2)
[INA240] Data Structures and Practice
3장. 포인터, 배열, 구조체 포인터, 배열, 구조체 학습목표 기본적 데이터 타입
Computer Architecture
Chapter 2. Finite Automata Exercises
Chapter 12. 직렬 통신과 무선 프로토콜.
목차 ▶ WPF란? ▶ 왜 WPF가 필요할까? ▶ 기본지식 ▶ 그래픽 표현 기술의 발전 ▶ WPF 시작하기 ▶ WPF 알아보기
Chapter 10. 파일 시스템 인터페이스(File System Interface)
Lecture 1. Overview of the Course
객체 지향 프로그래밍.
Real-time Tactics Game
adopted from KNK C Programming : A Modern Approach
TinyOS Tutorial Network lab. 김인태
Introduction to Programming Language
D:\win_9X\setup.exe 또는 D:\win_XP\setup.exe 을 클릭하여 설치합니다.
김 정 석 Web Programming 김 정 석
User Datagram Protocol (UDP)
JFS operation HP Korea / Operations JFS operation.
기술가정 2학년 1학기 4. 컴퓨터와 생활 > 1) 소프트웨어의 활용 > 4-6/11 소리 자료는 어떻게 만들까?
시스템 분석 및 설계 글로컬 IT 학과 김정기.
XML-II (eXtensible Markup Language) DTD/DOM
문자열 처리하기 working with Strings
Operating System Multiple Access Chatting Program using Multithread
1.비디오 메모리 잠그기 2.화면에 픽셀찍기 학습목표
DirectSound 프로그래밍 DirectSound를 사용하면 매우 짧은 지연 시간에 사운드를 재생해, 애플리케이션으로 하드웨어 리소스를 치밀하게 제어할 수 있다. DirectSound 인터페이스를 사용하여 다음과 같은 처리가 가능하게 된다. WAV 포맷의 파일 또는.
CHAP 1:자료구조와 알고리즘.
제 7장 이벤트.
Chapter 30 Creating Web Audio Files
창 병 모 숙명여대 전산학과 자바 언어를 위한 CFA 창 병 모 숙명여대 전산학과
1. 관계 데이터 모델 (1) 관계 데이터 모델 정의 ① 논리적인 데이터 모델에서 데이터간의 관계를 기본키(primary key) 와 이를 참조하는 외래키(foreign key)로 표현하는 데이터 모델 ② 개체 집합에 대한 속성 관계를 표현하기 위해 개체를 테이블(table)
게임과 1학년 Flipping - 파일을 읽어서 출력하는 프로그램
DirectX 9 Ch1. Direct3D 초기화.
Concurrency: Deadlock and Starvation
Lecture 7 7-Segment LED controller using u-controller
Chapter 7: Deadlocks.
Presentation transcript:

DirectX Audio 2002년 3월 최윤석 작성

Concepts of DirectX Audio Direct Sound Windows에서 사용할 수 있는 모든 사운드 카드에서 사운드를 재생할 수 있는 하나의 API. DirectX 6.1에서는 응용 프로그램이 게임의 음악을 동적으로 재생할 수 있도록 하는 DirectMusic이라는 새로운 요소 추가.

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 오디오에도 스크립트 언어를 썼는데, 이를 이용해 좀더 인터랙티브한 음악을 삽입

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.

Using DirectSound IDirectSound8 IDirectSoundBuffer8 IDirectSound3DBuffer8 IDirectSound3DListener8 IDirectSoundCapture8 IDirectSoundCaptureBuffer8 IDirectSoundNotify8 IKsProPertySet IDirectSound 사운드 카드의 기능을 결정하고 재생용 버퍼를 생성. IDirectSoundBuffer 재생 가은한 사운드 데이터를 유지할 데이터 버퍼 IDirectSound3DBuffer 3D 사운드를 보관할 버퍼, 거리, 위치, 투시 원뿔 등과 같은 추가 정보를 갖는다. IDirectSound3DListener 3D 수신자를 표현할 때 사용되는 개체, 3D 공간에서는 청취자의 위치와 방향에 따라 3D 버퍼가 서로 다른 사운드를 만든다. IDirectSoundCapture 캡쳐 버퍼를 생성하는데 사용되는 응용 프로그램 IDirectSoundCaptureBuffer 마이크와 같은 장치에서 녹음된 사운드 데이터를 보관하는데 사용되는 버퍼 IDirectSoundNotify 사운드 재생이 완료되었음을 응용 프로그램에게 알리는 기능을 가진 개체. IKsProPertySet 사양을 확장하지 않고도 드라이버에 특별한 기능들을 추가할 수 있도록 하는 사운드 제조업체에서 사용하는 인터페이스.

DirectSound Buffer DirectSound 주요도구 두가지 버퍼 Primary Buffer(오직 하나) 현재 사운드 카드에서 재생되는 사운드 Secondary Buffers 응용 프로그램에서 재생하려는 각 사운드 효과마다 하나의 보조 버퍼가 존재. 보조 버퍼는 주버퍼와 결합되어 사운드로 출력. 믹서를 사용하면 한번에 여러 개의 사운드 효과 출력 가능. 사운드 버퍼는 DirectDraw 버퍼와 매우 유사하나, 사운드 버퍼는 개념적으로 순환구조를 지닌다.

DirectSound 구조 Mixer Secondary Buffer Audio Mixer Primary Buffer Hardware device Speaker

DirectSound System Architecture

DirectSound 구현 DirectX SDK에서 WAV 파일을 로드하고, DirectSound 버퍼를 만드는 코드를 제공. 구현 순서 DirectSound 개체 생성. Cooperative Level 설정 Primary Buffer 생성 Primary buffer에 사운드 데이터를 채움 Lock, Unlock Play

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)) { …… }

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)) { ……………. };

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;

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;

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;

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

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 전체 사운드 버퍼를 잠근다.

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

Tutorial : Playing Audio Files Step 1: Initialize Step 2: Load a File Step 3: Play the File Step 4: Close Down

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

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

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

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

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.

g_pPerformance->CloseDown(); g_pLoader->Release(); g_pPerformance->Release(); g_pSegment->Release(); CoUninitialize(); return 0; // Return value for WinMain. }