DirectSound 프로그래밍 DirectSound를 사용하면 매우 짧은 지연 시간에 사운드를 재생해, 애플리케이션으로 하드웨어 리소스를 치밀하게 제어할 수 있다. DirectSound 인터페이스를 사용하여 다음과 같은 처리가 가능하게 된다. WAV 포맷의 파일 또는.

Slides:



Advertisements
Similar presentations
10장. 시기별 학급경영 11조 염지수 이 슬 권용민 신해식.
Advertisements

일본 근세사. (1) 에도막부의 개창 ( ㄱ ) 세키가하라의 전투 (1600) - 히데요시의 사후 다섯 명의 다이로 ( 大老 ) 가운데 최대 영지 (250 만석 ) 를 보유하고 있던 도쿠가와 이에야스가 급부상. 이에 이에야스와 반목해 온 이시다 미쓰나리 ( 石田三成 ),
아니마 / 아니무스 송문주 조아라. 아니마 아니마란 ? 남성의 마음속에 있는 여성적 심리 경향이 인격화 한 것. 막연한 느낌이나 기분, 예견적인 육감, 비합리적인 것에 대 한 감수성, 개인적인 사랑의 능력, 자연에 대한 감정, 그리.
대구가톨릭대학교 체육교육과 06 학번 영안중학교 체육교사 신웅섭 반갑습니다. 반야월초등학교 축구부 대륜중학교 축구부 대륜고등학교 대구가톨릭대학교 차석 입학 대구가톨릭대학교 수석 졸업 2014 년 경북중등임용 체육 차석 합격 영안중학교 체육교사 근무 소개.
조건문, 함수 정대진 ( ) C Programming -3 일차 ITA 8 월 강의.
일장 - 1 일 24 시간 중의 명기 ( 낮 ) 의 길이 ( 밤은 암기, 낮은 명기 ) 광주기성 - 하루 중 낮의 길이의 장단에 따라 식물의 꽃눈 형성이 달라지는 현상 일장이 식물의 개화현상을 조절하는 중요한 요인 단일식물 - 단일조건에서 개화가 촉진되는 식물 장일식물.
YES C 제 1 장 C 언어의 개요 1/34 제 1 장 C 언어의 개요 문봉근. YES C 제 1 장 C 언어의 개요 2/34 제 1 장 C 언어의 개요 1.1 프로그램과 C 언어의 특징 1.2 C 언어의 프로그램 구성 1.3 비주얼 C++ 통합 환경 들어가기.
2 학년 6 반 1 조 고은수 구성현 권오제 김강서.  해당 언어에 본디부터 있던 말이나 그것에 기초하여 새로 만들어진 말  어떤 고장 고유의 독특한 말  Ex) 아버지, 어머니, 하늘, 땅.
2014년도 교원 및 기간제교사 성과상여금 전달교육 개 회 국기에 대한 경례 - 인사말
2장. 윈도우즈 입출력 1/211 1.
7장. MDI 프로그래밍 MDI 프로그래밍에 대한 내용을 배우도록 한다. 지금까지 배운 것은 생성된 윈도우에 단일 화면이 존재하는 형태였다. 이것을 SDI라고 부르고 Single Document Interface의 약자이다. 하나의 문서를 하나의 화면에 보여주는 형태의.
선진 고양교육 “유아교육 행정 업무 연수” 유치원 회계실무 및 유아학비 연수 경기도고양교육청.
제 3 장 변수와 자료형.
묵자 겸애, 비명, 비공, 상현, 상동, 천지, 명귀, 삼표 법.
제 11 장 구조체.
컴퓨터 응용 및 실습 Part1. OOP&Java Programming data type Review
윈도우 운영체제와 윈도우 응용 프로그램의 특징을 이해한다.
C++ Espresso 제1장 기초 사항.
제1장 윈도우 프로그래밍 1.1 윈도우 프로그래밍의 개념 1.2 윈도우 프로그램의 기본 구조
5장. 단축키와 비트맵 윈도우 프로그램에는 화면에서 사용자들의 입력을 받아 들이고 출력을 위한 코드 외 부분이 존재한다. 이 부분을 주로 리소스라고 부르고 이들은 주로 화면에 나타난다. 메뉴, 툴바, 비트맵, 단축키, 대화상자 등이 여기에 속한다. 이 부분들은 우리의 프로그램의.
내 아이를 위한 구강관리.
제16장 원무통계 • 분석 ☞ 통계란 특정의 사실을 일정한 기준에 의하여 숫자로 표시한 것을 말한다.통계로서 활용할 수 있는 조건으로는 ① 동질성을 지녀야 하고 ② 기준이 명확하고 ③ 계속성이 지속되어야 하며 ④ 숫자로 표시하여야 한다 경영실적의.
인사업무 매뉴얼 업무매뉴얼 목차 사업본부 인사부문 업무처리절차 요약 부문별 업무매뉴얼 상세
서울지방세무사회 부가세 교육 사진클릭-자료 다운 세무사 김재우.
치매의 예방 김 은민 윤금 노인요양원 치매의.
제12장 유연한 카메라 클래스 만들기 학기 컴퓨터게임(DirectX).
5장. 리스트 리스트 학습목표 목록이나 도표처럼 여러 데이터를 관리할 수 있는 자료형을 추상화
8. 객체와 클래스 (기본).
DirectX Audio 2002년 3월 최윤석 작성.
PCI가 어렵울 거라는 생각을 지금부터 버리도록 합시다.
구조체 struct 구조체와 함수 구조체의 배열, sizeof 연산자 열거형 enum 형 정의 typedef
쉽게 풀어쓴 C언어 Express 제4장 변수와 자료형 C Express.
논리회로 및 실험 C++을 이용한 논리회로 기초 실습
제2절 법인세의 계산구조와 세무조정 1. 각 사업연도소득에 대한 법인세 계산구조 회계와 사회 결산서상 당기순이익
6. 기본 클래스 프로그래밍 6 컴퓨터공학과 신동일.
윤성우의 열혈 C++ 프로그래밍 윤성우 저 열혈강의 C++ 프로그래밍 개정판 Chapter 03. 클래스의 기본.
명품 Java Programming.
C 9장. 구조체 #include <stdio.h> int main(void) { int num;
Chapter 05. 클래스 완성. chapter 05. 클래스 완성 01. 복사 생성자 복사 생성(Copy Construction) 생성될 때 자신과 같은 타입의 객체를 변수로 받아, 이 객체와 같은 값을 갖는 새로운 객체를 생성하는 것 명시적인 생성 과정뿐만.
C++ 개요 객체지향 윈도우즈 프로그래밍 한국성서대학교 유일선
주소록 프로그램.
마산에 대하여 만든이 : 2204 김신우, 2202 권성헌.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
쉽게 풀어쓴 C언어 Express 제4장 변수와 자료형 C Express.
Chapter 3 클래스. 최호성.
컴퓨터의 기초 제 2강 - 변수와 자료형 , 연산자 2006년 3월 27일.
마을살이 제천덕산면을 중심으로 농촌공동체연구소장 한석주.
Direct X Demo 따라하기 Direct X Wizard를 이용하여 프로젝트를 생성한다
WSAAsync Select 김대열 Bit - Academy Sunmoon University, Korea.
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
프로그래머를 위한 첫걸음 JDBC Lecture 001 BY MINIO
1.비디오 메모리 잠그기 2.화면에 픽셀찍기 학습목표
Java 3장. 자바의 기본 구조 I : 변수, 자료형, 연산자 public class SumTest {
3장. 제어 메시지 처리하기 1/211 1.
6장 마케팅 조사 박소현, 김중호, 박기찬.
한밭대학교 창업경영대학원 회계정보학과 장 광 식
2015년 2학년 1반.
음양오행과 물리학 조 원 : 김용훈, 양범길, 박수진, 윤진희, 이경남, 박미옥, 박지선 (11조)
1학기 정리 지난 학기에 배운 내용을 복습해 본다..
속담이나 관용표현 사용하여 글쓰기 다섯째 마당 국어(말듣쓰) 6학년 1학기 마음을 나누며-되돌아보기 9/9 수업 수업 계획
제 14 장 응용 계층과 클라이언트-서버 모델 클라이언트-서버 모델 14.2 동시성 14.3 프로세스 14.4 요약.
이야기 치료에 대하여 <8조 학문적 글쓰기 발표> 주희록 최은지
홍미영 부평구 재정 및 운영방향 인천광역시 부평구.
게임과 1학년 Flipping - 파일을 읽어서 출력하는 프로그램
박성진 컴퓨터 프로그래밍 기초 [03] 변수와 자료형 박성진
8단계 3층을 완성한다 Case 1 Case 2 Case 3 Case 4
DirectX 9 Ch1. Direct3D 초기화.
C 13장. 입출력 라이브러리 #include <stdio.h> int main(void) { int num;
중국문학개론 한부와 겅건안문학 중어중국학과 ㅇ이진원 한부와 건안문학.
제 4장 Visual C++ COM 컴파일러.
Presentation transcript:

DirectSound 프로그래밍 DirectSound를 사용하면 매우 짧은 지연 시간에 사운드를 재생해, 애플리케이션으로 하드웨어 리소스를 치밀하게 제어할 수 있다. DirectSound 인터페이스를 사용하여 다음과 같은 처리가 가능하게 된다. WAV 포맷의 파일 또는 리소스로부터 사운드를 재생한다. 복수의 사운드를 동시에 재생한다. 커스터마이즈 가능한 3D환경에 사운드를 배치한다. 메아리나 코러스 등의 이펙트를 추가해, 이펙트의 파라미터를 동적으로 변경한다. 마이크 또는 그 외의 입력으로부터 WAV 사운드를 캡춰한다.

DirectSound 프로그래밍의 순서 장치 개체를 생성 한다. 2차 버퍼를 생성 한다. PCM 데이터를 얻어온다. DirectSoundCreate8 를 호출해, IDirectSound8 인터페이스를 지원 하는 개체를 생성 한다. 이 개체는 보통 디폴트 재생 장치를 나타낸다. 2차 버퍼를 생성 한다. IDirectSound8::CreateSoundBuffer를 사용해 사운드 데이터를 보관 유지하는 버퍼 개체를 생성 한다. 이러한 버퍼는, 모든 사운드를 믹싱 하는 개체인 1차 버퍼와 구별하기 위해, 2차 버퍼라고 부른다. PCM 데이터를 얻어온다. WAV파일 또는 리소스로부터 1차 버퍼에 데이터를 읽어낸다. 데이터를 버퍼에 저장 한다. DirectSoundBuffer::Lock를 호출해, 쓰기 조작용으로 2차 버퍼를 준비한다. 1차 버퍼로부터 그 주소에 데이터를 복사 한 후, IDirectSoundBuffer8::Unlock를 호출한다. 버퍼를 재생한다. IDirectSoundBuffer8::Play를 호출해 사운드를 재생한다. 버퍼에 대해서는, 마지막에 달한 시점에서 정지하는지, 또는 IDirectSoundBuffer8::Stop를 호출할 때까지 반복 재생을 계속하는지를 지시할 수 있다. 같은 데이터를 보관 유지하는 버퍼를 별도 생성하지 않는 한, 한번에 연주할 수 있는 사운드의 인스턴스는 1개 뿐이다. 임의의 수의 버퍼를 한 번에 재생할 수 있는 믹싱은 자동적으로 행해진다.

DirectSound 장치 개체의 생성 DirectSound를 사용하기 위해 장치 개체를 초기화를 한다. DirectSoundCreate 함수 원형 HRESULT WINAPI DirectSoundCreate8( LPCGUID lpcGuidDevice, LPDIRECTSOUND8 * ppDS8, LPUNKNOWN pUnkOuter ); DirectSoundCreate 함수 샘플 코드 LPDIRECTSOUND8 lpds; HRESULT hr = DirectSoundCreate8(NULL, &lpds, NULL));

협조 레벨 설정 DirectSound 에서는 3 종류의 협조 레벨이, 사운드 장치에 대해서 정의되고 있다. DSSCL_NORMAL 표준 협조 레벨 애플리케이션간 장치의 변환이 가장 원활히 행해진다. DSSCL_PRIORITY 우선 협조 레벨 거의 모든 게임 애플리케이션에서 사용하며 샘플링 레이트와 비트 깊이에 대한 애플리케이션 제어를 가능하게 하면서, 가장 강력하게 동작한다. DSSCL_WRITEPRIMARY 쓰기 우선 협조 레벨 1차 버퍼내의 오디오 샘플에 직접 쓰기 액세스를 실시하려면 , 애플리케이션을 쓰기 우선 레벨로 설정해야 한다. 애플리케이션이 이 레벨로 설정되지 않은 경우, 1차 버퍼에 대한 IDirectSoundBuffer::Lock 메서드의 호출은 모두 실패한다.

협조 레벨 설정 장치개체를 생성한 후 IDirectSound8::SetCooperativeLevel 메 서드를 사용해 장치 협조 레벨을 설정해야 한다. 협조레벨을 설정하지 않을 경우 소리가 나지 않는다. 다음의 예는 lpds에 의 DirectSound인터페이스에 의해 나타내지는 DirectSound의 장치 협조 레벨을 설정하고 있다. hwnd 파라미터는, 애플리케이션 윈도우의 핸들이다. HRESULT hr = lpDirectSound->SetCooperativeLevel( hwnd, DSSCL_PRIORITY); if (FAILED(hr)) { ErrorHandler(hr); // 에러 처리를 여기에 추가한다. }

버퍼의 설정 DSBUFFERDESC 구조체는, 새로운 버퍼 개체의 특성을 기술한다. IDirectSound8::CreateSoundBuffer 메서드 및 DirectSoundFullDuplexCreate8 함수로 사용된다. typedef struct { DWORD dwSize; DWORD dwFlags; DWORD dwBufferBytes; DWORD dwReserved; LPWAVEFORMATEX lpwfxFormat; GUID guid3DAlgorithm; } DSBUFFERDESC, *LPDSBUFFERDESC; typedef const DSBUFFERDESC *LPCDSBUFFERDESC;

버퍼의 설정 DSBUFFERDESC 구조체 멤버 dwSize dwFlags dwBufferBytes dwReserved 구조체의 사이즈. 사용하기 전에, 이 멤버를 초기화해야 한다. dwFlags 버퍼의 능력을 나타내는 플래그 dwBufferBytes 새로운 버퍼의 사이즈 (바이트 단위) 1차 버퍼를 생성할 때는 0을 설정. dwReserved 예약이 끝난 상태. 0 이 아니면 안된다. lpwfxFormat 버퍼의 웨이브 폼 포맷을 지정하는 WAVEFORMATEX구조체 또는 WAVEFORMATEXTENSIBLE 구조체의 주소 1차 버퍼에서는, 이 값은 NULL 이어야 한다. 애플리케이션은 IDirectSoundBuffer::SetFormat 를 사용해, 1차 버퍼의 포맷을 설정할 수 있다. guid3DAlgorithm DirectSound3D 의 하드웨어 에뮬레이션이 사용하는 2 스피커 가상화 알고리즘의 일의인 식별자

버퍼의 설정 버퍼 설정 및 생성 예제 코드 LPDIRECTSOUNDBUFFER pDSBPrimary = NULL; DSBUFFERDESC dsbd; ZeroMemory(&dsbd, sizeof(DSBUFFERDESC)); // 구조체 멤버 설정 dsbd.dwSize = sizeof(DSBUFFERDESC); dsbd.dwFlags = DSBCAPS_PRIMARYBUFFER; dsbd.dwBufferBytes = 0; dsbd.lpwfxFormat = NULL; HRESULT hr = m_pDS->CreateSoundBuffer( &dsbd, &pDSBPrimary, NULL );

버퍼의 설정 웨이브 폼 오디오 데이터의 포맷을 정의하는 코드. WAVEFORMATEX wfx; ZeroMemory(&wfx, sizeof(WAVEFORMATEX)); wfx.wFormatTag = (WORD)WAVE_FORMAT_PCM; wfx.nChannels = (WORD)2; wfx.nSamplesPerSec = (DWORD)22050; wfx.wBitsPerSample = (WORD)16; wfx.nBlockAlign = (WORD)(wfx.wBitsPerSample / 8 * wfx.nChannels); wfx.nAvgBytesPerSec = (DWORD)(wfx.nSamplesPerSec * wfx.nBlockAlign); HRESULT hr = pDSBPrimary->SetFormat(&wfx)

DirectSound의 예제 DirectSound 샘플의 중심적인 기능을 하는 Dsutil.h에 선언되고 Dsutil.cpp에서 구현된 클래스들을 가지고 간단한 예제를 구현한다. DirectSound샘플에서 사용되는 클래스는 다음과 같다. Csound 클래스 : 스태틱 버퍼 를 나타낸다. CSoundManager 클래스 : DirectSound 의 생성과 초기화, 1차 버퍼에의 액세스, 2차 버퍼의 생성을 위한 기능을 포함한다. CStreamingSound 클래스 : 스트리밍 버퍼 내의 사운드를 나타낸다. CWaveFile 클래스 : WAV 파일의 read와 쓰기, 메모리에 저장 되고 있는 WAV 리소스 또는 웨이브 폼으로부터의 read에 사용된다.

DirectSound의 예제 CSoundManager 클래스를 이용한 초기화, 협조레벨 설정 1차 버퍼의 포맷 형태를 설정 CSoundManager m_pCSM; m_pCSM.Initialize(hWnd, (DWORD)DSSCL_PRIORITY); hWnd는 윈도우 핸들이며 우선협조레벨로 설정하고 있다. 1차 버퍼의 포맷 형태를 설정 m_pCSM.SetPrimaryBufferFormat((DWORD)2, (DWORD)22050, (DWORD)16); 위의 코드에서 1차 버퍼를 2채널(스테레오), 22050kHz의 샘플링, 한 샘플을 16bit으로 표현하는 형태로 정의하고있다

DirectSound의 예제 CSoundManager 클래스를 이용한 생성 CSound *m_pCSBGSound; m_pCSM.Create(&m_pCSBGSound, strWaveFileName, 0, GUID_NULL, 5); CSoundManager::Create() 함수를 호출하여 생성을 한다. 인자로는 Csound의 객체포인터가 필요하며, WAVE 화일명,그리고 0과 GUID_NULL은 DSBUFFERDESC의 구조체를 채우는데 사용되며, 마지막 인자인 5는 만들어지는 버퍼 배열의 갯수이다.

DirectSound의 예제 CSound::Play()를 이용하여 재생을 한다. CSound::Play(DWORD dwPriority, DWORD dwFlags, LONG lVolume, LONG lFrequency, LONG lPan) 첫번째는 사운드의 우선도를 나타내고, 두번째 플래그에서는 사운드를 반복 할 수 있는 DSBPLAY_LOOPING플래그를 사용 할 수 있다. 나머지 3개의 플래그는 볼륨 설정, 샘플링 오디오의 재생 주파수 설정, 좌우축의 음원 위치를 설정할 수 있는 플래그이다.

DirectSound의 예제 CSound::Stop()를 이용한 재생 중지 m_pCSBGSound->Stop(); 재생을 할 때 DSBPLAY_LOOPING 플래그를 설정하고 재생하면 멈추지 않고 계속 재생을 하게 된다. 이 때 CSound::Stop()함수를 호출 하면 재생을 중지 시킬수 있다.

DirectSound의 예제 예제에서는 사용을 편리 하게 하기 위해 MyDirectSound라는 클래스를 만들었다. #ifndef MYDIRECTSOUND_H #define MYDIRECTSOUND_H #define LOOP (DWORD)DSBPLAY_LOOPING //반복 재생을 위한 정의 typedef struct { //재생 정보를 구조체로 정의 DWORD dwPriority; DWORD dwFlags; LONG lVolume; LONG lFrequency; LONG lPan; }PLAYINFO;

DirectSound의 예제 HRESULT CreateBGSound(LPTSTR strWaveFileName); class MyDirectSound{ private: CSoundManager m_pCSM; CSound *m_pCSBGSound; CSound *m_pCSFGSound; HRESULT hr; PLAYINFO pi; public: MyDirectSound(); ~MyDirectSound(); HRESULT Initialize(HWND hWnd); HRESULT CreateBGSound(LPTSTR strWaveFileName); HRESULT CreateFGSound(LPTSTR strWaveFileName); HRESULT PlayBGSound(); HRESULT PlayFGSound(DWORD dwFlag = 0); HRESULT StopBGSound(); HRESULT StopFGSound(); };

DirectSound의 예제 코딩순서 기존에 생성 되어 있는 프로젝트에 Source Files에 DSUtil.cpp와 MyDirectSound.cpp를 Header Files에 DSUtil.h 와 MyDirectSound.h 파일을 추가한다. WinMain 함수가 있는 cpp 파일에서 DSUtil.h와 MyDirectSound.h 파일을 인클루드 시킨다.

DirectSound의 예제 코딩순서 인클루드 시킨다음 전역변수로 MyDirectSound객체를 선언하고 ex) MyDirectSound mydsapp; 메시지프로시저함수 안에 case WM_CREATE: mydsapp.Initialize(hWnd); mydsapp.CreateBGSound("11.wav"); mydsapp.CreateFGSound("bounce.wav"); mydsapp.PlayBGSound(); return(0); 와 같이 코딩을 하면 실행시에 11.wav를 배경음악으로 bounce.wav를 효과음악으로 로드하며 프로그램실행과 동시에 배경음악을 플레이 하도록 되어있다.

DirectSound의 예제 코딩순서 위의 코드에서 mydsapp.CreateBGSound("11.wav"); mydsapp.CreateFGSound("bounce.wav"); 따옴표안의 화일명을 고치면 다른 파일로 변경할 수 있다. 배경음악과 효과음악을 구분해놓은 이유는 배경음악은 LOOP옵션을 기본적으로 주었고 효과음악은 재생시에 PlayFGSound();를 호출하면 한번 재생, PlayFGSound(LOOP);로 호출하면 반복재생할 수 있다.

DirectSound의 예제 코딩순서 키보드의 입력을 받을 때마다 효과음악을 재생하고자 하면 WndProc(메시지프로시저함수)에서 switch문안에 case WM_KEYDOWN: mydsapp.PlayFGSound(); return(0); 와같이 코딩하여 호출하면 키보드 입력이 있을 때마다 효과음악을 재생하게 된다.

DirectSound의 예제 MyDirectSound::Initialize(HWND hWnd) 1차버퍼의 포맷을 2채널 22050샘플링 비율 16비트로 정의한다. MyDirectSound ::CreateBGSound(LPTSTR strWaveFileName) 인자로 되어있는 화일이름을 배경음악으로 읽어들인다. MyDirectSound ::CreateFGSound(LPTSTR strWaveFileName) 인자로 되어있는 화일이름을 효과음으로 읽어들인다. MyDirectSound ::PlayBGSound() 배경음악을 재생하는 함수이다. 기본적으로 반복재생을 한다. 재생을 할 수 있는 함수 두번째 플래그에(DWORD)DSBPLAY_LOOPING 인자값을 넣으면 반복 재생을 할 수 있다.

DirectSound의 예제 MyDirectSound ::StopBGSound() 배경음악 재생을 멈추는 함수 생성된 Csound 객체멤버함수인 Reset()를 호출하면 처음부터 재생을 한다. MyDirectSound ::StopFGSound() 효과음 재생을 멈추는 함수