|
public class XnaFrameworkDispatcherService : IApplicationService { DispatcherTimer frameworkDispatcherTimer; public void StartService(ApplicationServiceContext context) { frameworkDispatcherTimer.Start(); }
public void StopService() { frameworkDispatcherTimer.Stop(); } public XnaFrameworkDispatcherService() { this.frameworkDispatcherTimer = new DispatcherTimer(); this.frameworkDispatcherTimer.Interval = TimeSpan.FromTicks(333333); this.frameworkDispatcherTimer.Tick += new EventHandler(frameworkDispatcherTimer_Tick); FrameworkDispatcher.Update(); }
void frameworkDispatcherTimer_Tick(object sender, EventArgs e) { FrameworkDispatcher.Update(); } } |
App.xaml
<Application ...
<!--Application Resources--> <Application.Resources> </Application.Resources>
<Application.ApplicationLifetimeObjects> <!--Required object that handles lifetime events for the application-->
... </Application.ApplicationLifetimeObjects>
</Application>
|
음향 녹음
휴대폰의 마이크로 음향을 녹음하려면 Microphone 클래스를 사용하면 됩니다.
Public Fields
Public Properties
Public Methods
Public Events
|
mic = Microphone.Default; |
정적 Default 속성으로 클래스의 인스턴스를 생성합니다.
샘플 속도는 고정되있어 변경할 수 없으며 SampleRate 속성은 초당 샘플 수 16,000을 반환합니다. Nyquist 샘플 정리에 따르면 이 속도는 8,000Hz 주파수까지의 음향에 적합합니다. 즉, 음성의 경우에는 괜찮지만 음악의 경우에는 크게 기대하지 않는 것이 좋답니다. 각 샘플은 2바이트 길이의 모노이며 녹음된 음향은 초당 32,000바이트, 분당 1.9MB공간을 차지합니다.
마이크 데이터는 바이트 배열인 버퍼를 통해 프로그램에 제공됩니다.
mic.BufferReady += new EventHandler<EventArgs>(mic_BufferReady); |
BufferReader 이벤트에 대한 처리기를 설치하고 Start를 호출하여 녹음을 시작합니다.
int sampleSize = mic.GetSampleSizeInBytes(mic.BufferDuration); byte[] _buf = new byte[sampleSize]; int data_size = mic.GetData(_buf); |
Microphone 개체가 BufferReady 이벤트를 발생시키면 GetData를 호출합니다. GetData가 반환되면 버퍼에 PCM 데이터가 채워집니다. 프로그램에서 녹음을 중지하려면 GetData를 다시 호출하고 마지막 부분 버퍼를 얻으면 됩니다. 메서드는 배열로 전송된 바이트 수를 반환합니다. 그런 다음 Stop을 호출하면 됩니다.
Microphone에서 허용하는 유일한 옵션은 GetData에 전달하는 버퍼의 바이트 크기를 지정하는 것입니다. BufferSize 속성은 100밀리초에서 1,000밀리초(1초) 범위이며 10밀리초 단위로 지정하는 TimeSpan 값입니다. Default값은 1초입니다.
음향 재생(wav)
Microsoft.Xna.Framework.Audio 네임스페이스의 SoundEffect와 SoundEffectInstance 클래스를 사용하면 미리 녹음된 음향을 재생할 수 있습니다. 정적 SoundEffect.FromStream 메서드에는 완전한 RIFF 헤더를 포함하는 표준 Windows WAV 파일을 참조하는 Stream 개체가 필요합니다.
WAV 파일이 아닌 원시 PCM 데이터로 작업하려면 SoundEffectInstance에서 파생되는 DynamicSoundEffectInstance 클래스를 사용해야 합니다. 이 클래스는 Microphone 클래스나 음악 신서사이저 프로그램과 같이 동적으로 오디오 파형을 생성하는 프로그램에 적합합니다.
DynamicSoundEffectInstance 생성자에는 샘플 속도와 채널 수를 지정해야 합니다. 마이크에서 생성한 데이터에 이 클래스를 사용하려는 경우 이 값을 일정한 값으로 유지하면 됩니다.
playback = new DynamicSoundEffectInstance(mic.SampleRate, AudioChannels.Mono); |
반면에 동물 소리와 같은 복잡한 음향을 재생하려면 첫 번째 인수에 2를 곱하면 됩니다. DynamicSoundEffectInstance에는 16비트 샘플 크기를 사용합니다. 클래스에는 재생을 제어하는 Play, Pause, Resume 및 Stop 메서드와 현재 상태를 나타내는 State 속성이 있습니다. 이 클래스는 Microphone과는 거의 반대로 작동하며 새 버퍼가 필요하면 BufferNeeded 이벤트를 발생시킵니다. SubmitBuffer메소드에 위에서 얻은 PCM데이터(byte[])을 인자로 넘겨주시면 재생됩니다.
playback.SubmitBuffer(buffer); playback.Play(); |
참고 : MSDN Magazine