학습 내용

조 : 2조

작성자 : 김동영

작성일 : 2011. 5. 25

제목 : WindowsPhone7 음향 녹음&재생

 

스마트폰과 음향

WindowsPhone7에서는 Microsoft.Xna.Framework.Audio 네임스페이스의 클래스를 사용하여 휴대폰의 마이크로 음향을 녹음하고 스피커로 재생 할 수 있습니다. XNA 클래스지만 Silverlight 프로그램에서도 사용이 가능합니다.

Microsoft.Xna. Framework.Audio 네임스페이스의 클래스는 오디오 CD 및 Windows WAV 파일에 사용되는 방식과 동일한 표준 PCM 형식의 압축되지 않은 오디오 데이터를 처리합니다. PCM의 경우 아날로그 음향 진폭이 일정한 비율(일반적인 초당 샘플 수, 8000-48000)로 샘플링되고 각 샘플이 8비트 또는 16비트 값으로 저장됩니다. 특정 음향을 저장하는 데 필요한 공간은 재생 시간(초), 샘플 속도, 샘플당 바이트 수를 곱한 값이며 스테레오의 경우 다시 2를 곱합니다.

Silverlight 프로그램이 XNA 오디오 서비스를 사용할 때는 정적 FrameworkDispatcher.Update 메서드를 비디오 새로 고침 빈도와 거의 같은 속도로 호출해야 합니다. 이 속도는 Windows Phone 7의 경우 약 초당 30번에 해당합니다. 이를 수행하는 방법은 XNA 온라인 설명서에 있는 문서"Windows Phone 응용 프로그램에서 XNA Framework 이벤트 활성화"에 나옵니다.

 

음향 녹음

휴대폰의 마이크로 음향을 녹음하려면 Microphone 클래스를 사용하면 됩니다.

 

Microphone Members

Public Fields

 

이름

설명

 

Name

마이크의 이름을 반환합니다

 

 

Public Properties

 

이름

설명

Static

All

모든 현재 사용 가능한 마이크의 컬렉션을 반환합니다.

 

BufferDuration

마이크의 오디오 캡처 버퍼 기간을 설정하거나 가져옵니다.

Static

Default

기본 연결된 마이크를 반환합니다.

 

IsHeadset

유선 헤드셋이나 블루투스 장치를 확인합니다.

 

SampleRate

오디오 데이터를 캡처하는 샘플 속도를 반환합니다.

 

State

마이크 개체의 녹음 상태를 반환합니다

 

 

Public Methods

 

이름

설명

 

GetData

마이크에서 기록 된 최신 데이터를 가져옵니다.

 

GetSampleDuration

버퍼의 크기를 기반으로 하는 오디오의 재생 시간을반환합니다.    

 

GetSampleSizeInBytes

마이크 개체에 대한 오디오의 지정된 기간을 잡고 하는데 필요한 바이트 배열의 크기를 반환합니다.

 

Start

마이크 오디오 캡처를 시작합니다.

 

Stop

마이크 오디오 캡처를 중지합니다.

 

 

Public Events

 

이름

설명

 

BufferReady

오디오 캡처 버퍼를 처리할 준비가 되면 발생

 

 

 

 

mic = Microphone.Default;

정적 Default 속성으로 클래스의 인스턴스를 생성합니다.

 

샘플 속도는 고정되있어 변경할 수 없으며 SampleRate 속성은 초당 샘플 수 16,000을 반환합니다. Nyquist 샘플 정리에 따르면 이 속도는 8,000Hz 주파수까지의 음향에 적합합니다. 즉, 음성의 경우에는 괜찮지만 음악의 경우에는 크게 기대하지 않는 것이 좋답니다. 각 샘플은 2바이트 길이의 모노이며 녹음된 음향은 초당 32,000바이트, 분당 1.9MB공간을 차지합니다.

 

 

마이크 데이터는 바이트 배열인 버퍼를 통해 프로그램에 제공됩니다.

 

mic.BufferReady += new EventHandler<EventArgs>(mic_BufferReady);
mic.Start();

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

 

 

[21기_김동영]_음향_녹음&amp;재생.docx

WindowsPhone7 네비게이션, 파노라마 컨트롤, 피벗 컨트롤

2011 5 12일 수요일

선문비트21 2

21기 김동영

 

 

 

l  네비게이션

 

네비게이션은 페이지간 이동입니다.

 버튼을 클릭하였을 때, 네비게이션 클래스를 이용해 네비게이션을 하도록 하였습니다.

 

MainPage.xaml.cs

private void button_bmi_Click(object sender, RoutedEventArgs e)

        {

            Navigation.GoToPage(this, ApplicationPages.Pivot);           

        }

 

        private void button1_Click(object sender, RoutedEventArgs e)

        {

            Navigation.GoToPage(this, ApplicationPages.Panorama);           

        }

 

        private void button2_Click(object sender, RoutedEventArgs e)

        {

            Navigation.GoToPage(this, ApplicationPages.BmiPage);  

        }

 

Navigation.cs

public enum ApplicationPages

    {

        Pivot,

        Panorama,

        BmiPage

    }

    public static class Navigation

    {       

        public static void GoToPage(this PhoneApplicationPage phoneApplicationPage, ApplicationPages applicationPage)

        {

            switch (applicationPage)

            {

                case ApplicationPages.BmiPage:

                    StartNavigate(phoneApplicationPage, new Uri("/Views/BmiPage.xaml", UriKind.Relative));                   

                    break;

                case ApplicationPages.Pivot:

                    StartNavigate(phoneApplicationPage, new Uri("/Views/PivotBmiPage.xaml", UriKind.Relative));                   

                    break;

                case ApplicationPages.Panorama:                StartNavigate(phoneApplicationPage, new Uri("/Views/PanoramaBmiPage.xaml", UriKind.Relative));                

                    break;

            }

        }

 

        private static void StartNavigate(PhoneApplicationPage phoneApplicationPage, Uri uri)

        {

            phoneApplicationPage.NavigationService.Navigate(uri);

        }       

    }

 

 

페이지의 NavigationService 속성의 Navigate 메서드를 이용해 페이지를 이동시켰습니다.

 

UriKindUri 메서드에 대한 Uri 종류를 정의한 열거형입니다.

멤버 이름

설명

RelativeOrAbsolute

URI 종류가 결정되지 않았습니다.

Absolute

URI 절대 URI입니다.

Relative

URI 상대 URI입니다.

                                                                      

 

 

 

 

 

l  피벗 컨트롤

 

Ctrl+Shift+A를 이용하여 New Item을 실행합니다. 파노라마 페이지를 만들 것이므로 Windows Phone Pivot Page를 선택하고 이름을 설정하고 Add 버튼을 클릭합니다.

 

 

 

Default PivotItem 2개 추가 되어 있는 것을 확인 하실 수 있습니다.

xaml코드로 PivotItem아이템을 제어하시거나 속성에 보시면 Items Collection을 이용하여 아이템을 제어 하실 수 있습니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

l  파노라마 컨트롤

Ctrl+Shift+A를 이용하여 New Item을 실행합니다. 파노라마 페이지를 만들 것이므로 Windows Phone Panorama Page를 선택하고 이름을 설정하고 Add 버튼을 클릭합니다.

 

 

 

DefaultPanoramaItem 2개 추가 되어 있는 것을 확인 하실 수 있습니다.

xaml코드로 PanoramaItem 아이템을 제어하시거나 속성에 보시면 Items Collection을 이용하여 아이템을 제어 하실 수 있습니다.

 

 

 

 [21기_김동영]WP7네비게이션,파노라마,피벗.docx

 

 

 

네비게이션,피벗,파노라마.zip

WindowsPhone7 개발도구설치 및 간단한 HelloPhone어플만들기

2011년 5월 11일 수요일

선문비트21기 2조

21기 김동영

 

 

 

 

  • WindowsPhone7 개발 도구 설치

 

 

시스템 사양

• Supported Operating Systems : Windows 7, Windows Vista

• Windows® Vista® (x86 and x64) with Service Pack 2 – all editions except Starter Edition

• Windows 7 (x86 and x64) – all editions except Starter Edition

• Installation requires 3 GB of free disk space on the system drive.

• 2 GB RAM

• Windows Phone Emulator requires a DirectX 10 capable graphics card with a WDDM 1.1 driver

 

 

 

Msdn 사이트로 접속을 합니다. (http://msdn.microsoft.com/ko-kr/default.aspx)

 

Phone을 클릭합니다.

 

 

 

빨간색으로 표시 되어있는 링크를 클릭합니다.

(http://www.microsoft.com/downloads/en/details.aspx?familyid=04704acf-a63a-4f97-952c-8b51b34b00ce&displaylang=en)

 

vm_web.exe를 다운로드 합니다. vm_web.exe는 단지 설치 관리자이기 때문에 용량이 작습니다. 다음 부터의 설치는 자동으로 됩니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • HelloPhone Application 만들기

 

시작->모든 프로그램->Microsoft Visual Studio 2010 Express->Microsoft Visual Studio 2010 Express for Windows Phone 또는 바탕화면에 있는 바로가기 아이콘을 실행합니다.

 

 

 

 

 

File->New Project 또는 Ctrl+Shift+N 단축키를 사용하여 새로운 프로젝트를 생성하겠습니다.

Silverlight for Windows Phone 프로젝트를 선택 한 후, Windows Phone Application을 선택하고, 프로젝트 이름을 HelloPhone으로 지정해주고 OK버튼을 클릭합니다.

 

 

 

 

 

다음과 같은 창이 뜹니다.

 

 

 

 

 

 

 

 

 

Solution Explorer에서 Windows Phone 애플리케이션 템플릿으로 만들어진 프로젝트 구조는 다음과 같습니다.

 

항목

설명

App.xaml /

App.xaml.cs

애플리케이션의 진입점을 정의하고 애플리케이션 범위 리소스를 초기화하며 애플리케이션 사용자 인터페이스를 표시합니다.

MainPage.xaml/ MainPage.xaml.cs

애플리케이션 사용자 인터페이스를 포함한 페이지를 정의합니다.

ApplicationIcon.png

전화기의 애플리케이션 목록에서 애플리케이션 아이콘으로 쓰일 아이콘의 이미지 파일입니다.    

Background.png

시작 화면에서 애플리케이션 아이콘으로 쓰일 아이콘의 이미지 파일입니다.

SplashScreenImage.jpg

애플리케이션을 실행할 우선적으로 표시되는 이미지입니다. 시작 화면(splash screen) 애플리케이션이 실행 중이며 페이지 탐색이 완료될 때까지 표시된다는 즉각적인 정보를 사용자에게 제공합니다. 애플리케이션이 실행될 것이라는 인상을 주기 위해 시작 화면은 페이지와 유사하게 나타낼 있습니다.

Properties\

AppManifest.xml

애플리케이션 패키지를 생성하는 필요한 애플리케이션 매니페스트 파일입니다.

Properties\AssemblyInfo.cs

생성된 어셈블리에 내장되는 이름과 버전 메타데이터를 포함합니다.

Properties\

WMAppManifest.xml

Silverlight for Windows Phone에만 사용할 있는 특정한 기능을 포함하여 Windows Phone Silverlight 애플리케이션과 관련된 특정한 메타데이터를 포함한 매니페스트 파일입니다.

References 폴더

애플리케이션 작동을 위해 필요한 서비스와 기능을 제공하는 라이브러리 목록(어셈블리)입니다.

 

 

App.xaml의 비하인드 코드를 보시면 다음과 같은 메소드 들이 보이는데 각각의 메소드들은 아래의 역할을 합니다.

 

Application_Launching

어플리케이션이 시작될 때 실행되는 메소드입니다.

Application_Closing

어플리케이션이 종료될 때 실행되는 메소드입니다.

Application_Activated

어플리케이션이 활성화될 때 실행되는 메소드입니다.

Application_Deactivated

어플리케이션이 비활성화될 때 실행되는 메소드입니다.

 

 

 

 

도구상자에 Button과 TextBox를 배치합니다. Button을 클릭하면 위에 page name이라는 TextBlock의 Text를 TextBox에 입력한 문자열로 변경 하도록 하겠습니다.

 

Button을 더블클릭하거나 이벤트의 Click이벤트를 추가하여 아래의 코드를 추가합니다.

private void button1_Click(object sender, RoutedEventArgs e)

{

PageTitle.Text = textBox1.Text;

}

 

F5를 눌르셔서 디버깅 모드로 하거나, 컨트롤+F5를 누르셔서 실행을 하면

위와 같이 어플리케이션이 실행된 것을 확인 할 수 있습니다.

위와같이 키패드를 마우스로 클릭하여 문자를 입력할수도 있고, 키보드의 Pause/Break 누르시면 키보드로 입력이 가능합니다.

 

결과 창입니다.

 

: 디버깅 세션을 시작할 때 에뮬레이터 환경을 준비하고 애플리케이션을 실행하기 위해 느껴질 정도의 시간 지연이 발생합니다. 디버깅 작업 효율을 높이기 위해 Visual Studio에서 소스 코드로 작업하는 동안 에뮬레이터를 닫지 마십시오. 에뮬레이터가 실행되면 현재 세션을 중단하고 소스 코드를 편집하여 새 애플리케이션 이미지를 구축 및 배포한 후 새 디버깅 세션을 시작하는 데 거의 시간이 걸리지 않습니다.

 

참고: Windows Phone 7 실습 교재 (http://msdn.microsoft.com/ko-kr/gg415576 에서 다운로드 가능)

 

 

[21기_김동영]WindowsPhone7_개발도구설치_및_간.docx

+ Recent posts