블로그 이미지
Every unexpected event is a path to learning for you.

카테고리

분류 전체보기 (2324)
Unity3D (568)
Programming (472)
Unreal (4)
Gamebryo (56)
Tip & Tech (185)
협업 (34)
3DS Max (3)
Game (12)
Utility (116)
Etc (92)
Link (31)
Portfolio (19)
Subject (90)
iOS,OSX (38)
Android (13)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (1)
Memories (19)
Interest (37)
Thinking (36)
한글 (26)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (19)
Exercise (3)
나만의 맛집 (2)
냥이 (9)
육아 (9)
Total1,344,773
Today198
Yesterday150
Statistics Graph

달력

« » 2019.12
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        

공지사항

태그목록

최근 만들고 있는 프로그램에 사용할 음성재생 라이브러리를 이것저것 살펴보다가..

WMPLib, MBroMP3, DirectX.AudioVideoPlayback 이렇게 3가지를 놓고 상당한 고민을 했습니다.

이것저것 살펴본결과, 직접 구현하면서 사용하기에는 DirectX.AudioVideoPlayback이 수월해보여 이녀석으로 결정했습니다.

기념으로 DirectX.AudioVideoPlayback을 사용해서 간단하게 음성파일 재생을 구현해 보도록하겠습니다.

 

Microsoft.DirectX.AudioVideoPlayback을 사용하면 생각보다 간편하게 기능을 구현할 수 있습니다만..

.NET 1.1에서 구현된 녀석들을 .NET 2.0에서 사용하면 등장하는 문제인 LoaderLock 버그가 여기에도 존재합니다.

차근차근 구현하고.. 이 LoaderLock이 등장하지 않도록 하는 것까지 오늘은 알아보도록 하겠습니다.

 

우선 가장 먼저 해야할 일은 이 녀석을 사용하기 위한 준비과정이 되겠죠?

아래 그림처럼 참조추가의 .NET탭에서 Microsoft.DirectX.AudioVideoPlayback 항목을 선택해줍니다.


 

 

그러면 솔루션 탐색기에서 추가된 참조를 확인할 수 있습니다.

이녀석을 더블클릭해서 개체 브라우저로 잠시 우리가 사용할 녀석을 확인해보도록하지요.

 


이처럼 설명도 모두 나와있으니, 참고하시면 되겠습니다.

기본적으로 필요한 메소드와 프로퍼티는 모두 제공하고 있으므로 생각보다 쉬울 것 같습니다.

 

간단하게 폼이 로드되면 재생되는 코드를 만들어 볼까요?


그림과 같이 사용하시면 해당 경로의 음악파일을 자동으로 재생합니다. 두 번째 인자를 false로 주면 자동 재생은 안되죠.

이 외에 필요시에는 Play()나 Open()메소드를 이용하시면 되겠습니다.

 

이렇게 했지만.. 아마도 막상 시작을하면 LoaderLock예외가 발생하면서 프로그램이 중단될 것입니다.

아래와 같이 하면.. 완전히 해결하는 것은 아니지만, 프로그램이 죽지않게 할 수 있습니다.

(제가 알고 있는 완벽하게 해결하는 방법은 .Net Framework 1.1을 설치하는 것입니다.)

 

디버그 -> 예외 -> Managed Debugging Assistant -> LoaderLock의 Throw속성을 체크해제합니다.


 

 

LoaderLock예외를 이렇게 처리하고나면 이녀석을 컨트롤과 연결시켜서 사용자의 요구에 따라서 동작하는

재생프로그램을 만들고 싶으실지도 모르겠습니다.

재생시간이나 볼륨을 TrackBar와 연동시키고 싶다면.. TrackBar를 생성하고 TrackBar의 ValueChanged이벤트가

발생했을 때, 해당 Value를 받아와서 수행시키게하고... 재생, 중지등에 대한 적절한 이미지를 만들어 주고, 이 녀석들에 대한 Click이벤트를 Stop(), Pause()등의 메소드들과 연결하시면 되겠습니다.

 

 

문제는 재생중에 재생시간에 대한 TrackBar를 움직여야 한다는 점인데요. 이 부분은 쓰레드로 해결을 하는 수밖에 없겠지요.

Invoke를 사용해서 한다면 특별한 문제점은 없을거라고 생각합니다만..

처음에 언급했던 너무 완벽한 버그인 LoaderLock때문에 문제점이 발생하지 않을지는 저도 해보아야 알것 같습니다.

이 부분은 해보고 빠른 시일내에 이 글을 수정하는 식으로 업데이트하도록 하겠습니다.

 -> 확인결과 이상없이 잘 수행됩니다.

 

 

 

이로써 간단하게 음악파일을 재생할 수 있는 기능을 살펴보았습니다.


 
[출처] 〃C# DirectX.AudioVideoPlayback를 이용한 음성파일 재생.|작성자 Chuls

Posted by blueasa

댓글을 달아 주세요

C#에서 DirectX를 활용하여 Wave파일을 재생하기 위해서는

새로운 참조를 추가해야 한다...

 

 

 

참조 추가 창에서 .NET 텝을 선택한 후 다음의 두 가지 구성요소를 선택한다.

 

      - Microsoft.DirectX

      - Microsoft.DirectX.DirectSound

 

 

 

참조 추가가 완료되면 솔루션 탐색기의 참조 리스트에 나타나게 된다.

 

 

 

그런 다음 소스 코드에 필요사항을 기입한다.

 

// 해당 참조 포함하기

using Microsoft.DirectX;

using Microsoft.DirectX.DirectSound;

 

// Device 생성자와 Buffer 선언 : Form1 클래스

private Device dsDevice = null;
private SecondaryBuffer buffer = null;

 

// Device 선언 및 설정 : InitializeComponent() 하위
dsDevice = new Device();
dsDevice.SetCooperativeLevel(this, CooperativeLevel.Normal);

 

// 실제 재생 부분

buffer = new SecondaryBuffer("sample.wav", dsDevice);
if(dsDevice != null) buffer.Play(0, BufferPlayFlags.Default);

 

 

DirectX를 활용하여 Wave파일을 재생하면

Winmm.dll API를 사용할 때와 달리 중복하여

Wave파일을 재생할 수 있다.


출처 : http://blog.naver.com/hero_juni/90034144815
Posted by blueasa
TAG DirectX, wave

댓글을 달아 주세요

NiApplication의 멤버변수 NiRendererPtr  m_spRenderer 
는 DX의 디바이스가 생성되면서 할당되어지는 스마트 포인터이다.

하지만 m_spRenderer로 직접 DX제어에 접근할 수는 없다., 즉 디바이스를 얻어올수는 없다.
따라서 다른 수가 필요한데

NiRenderer* pNiRender = m_spRenderer;             // 로 NIRender포인터에 넣어두고
NiDX9Renderer* pDX9Render = (NiDX9Renderer*)pNiRenderer; // 로 형변환 시킨다.

그럼 직접 접근할 수 있다.

pDX9Renderer->GetD3DDevice();  // 로 얻어올수 있다.


'Gamebryo > Learn' 카테고리의 다른 글

겜브리오의 텍스처 공유  (0) 2011.11.11
DirectX 디바이스 얻어오기  (0) 2010.11.04
충돌 박스 노드에 임시 생성  (0) 2010.07.02
여러창 동시 렌더링  (0) 2010.07.02
Gamebryo 템플릿 클래스  (0) 2010.04.08
렌더러를 만들어보자  (0) 2010.04.08
Posted by blueasa

댓글을 달아 주세요