locked
SoundEffectInstance 동시 재생 관련 RRS feed

  • 질문

  • SoundEffect를 이용해서 앱을 만들고 있습니다.

    SoundEffect로 76개의 wav 파일을 로딩했습니다. 각각의  wav 파일은 대략 1초 정도의 짧은 재생 길이를 가지고 있구요.

    play 버튼이 터치 되었을 때 PlaySoundNote()라는 함수를 호출해서 동시 연주를 할 수 있도록 구성했는데요.

    이때는 SoundEffectInstance를 사용합니다. (볼륨 및 pan 등의 컨트롤을 위해서요.)

    SoundEffectInstance로는 최대 6개까지만 생성해서 활용합니다.

    얼추 잘 되긴 하는데요..

    이상하게 play 버튼이 처음 터치 되었을 때 6개의 음들이 동시에 재생이 안되고 약간 불규칙적으로 끊기는 현상이 있다는 겁니다.

    이게 처음 play 버튼 터치할 경우 유독 많이 발생하구요.. 계속해서 막 터치하면 정상적으로 동시 재생이 됩니다.

    에뮬레이터가 아닌 실제 폰에 탑재해서 해봤는데도 이러한 현상이 발생하네요. (Release 로 컴파일 해서 탑재해 봤었습니다.)

    뭐가 문제일까요? ㅠㅠ

        public partial class MainPage : PhoneApplicationPage
        {

            :

            private SoundEffect[] m_Sound = new SoundEffect[76];

            :

            public MainPage()
            {
                InitializeComponent();

                :

                // 사운드 파일을 로딩함
                LoadSoundResources();

            }

            // 사운드 파일을 메모리에 로딩한다.
            private void LoadSoundResources()
            {
                // Timer to simulate the XNA game loop (SoundEffect class is from the XNA Framework)
                GameTimer gameTimer = new GameTimer();
                gameTimer.UpdateInterval = TimeSpan.FromMilliseconds(33);

                //// Call FrameworkDispatcher.Update to update the XNA Framework internals.
                gameTimer.Update += delegate { try { FrameworkDispatcher.Update(); } catch { } };

                //// Start the GameTimer running.
                gameTimer.Start();

                // Prime the pump or we'll get an exception.
                FrameworkDispatcher.Update();

                string strName = "";
                for (int i = 0; i < 76; i++)
                {
                    strName = "Sounds/" + (40 + i).ToString() + ".wav";
                    LoadSound(strName, out m_SteelStringSound[i]);
                }
            }

            /// <summary>
            /// Loads a wav file into an XNA Framework SoundEffect.
            /// </summary>
            /// <param name="SoundFilePath">Relative path to the wav file.</param>
            /// <param name="Sound">The SoundEffect to load the audio into.</param>
            private void LoadSound(String SoundFilePath, out SoundEffect Sound)
            {
                // For error checking, assume we'll fail to load the file.
                Sound = null;

                byte[] resourceByte;

                try
                {
                    // Holds informations about a file stream.
                    StreamResourceInfo SoundFileInfo = App.GetResourceStream(new Uri(SoundFilePath, UriKind.Relative));

                    resourceByte = new byte[SoundFileInfo.Stream.Length];
                    SoundFileInfo.Stream.Read(resourceByte, 0, (int)SoundFileInfo.Stream.Length);

                    MemoryStream stream = new MemoryStream(resourceByte, false);

                    Sound = SoundEffect.FromStream(stream);

                    FrameworkDispatcher.Update();

                    stream.Close();
                }
                catch (NullReferenceException)
                {
                    // Display an error message
                    MessageBox.Show("Couldn't load sound " + SoundFilePath);
                }
            }

          // 연주한다.
            private void PlaySoundNote()
            {
                SoundEffectInstance[] buf = new SoundEffectInstance[6];

                buf[0] = m_Sound[43 - 40].CreateInstance();
                buf[1] = m_Sound[48 - 40].CreateInstance();
                buf[2] = m_Sound[52 - 40].CreateInstance();
                buf[3] = m_Sound[55 - 40].CreateInstance();
                buf[4] = m_Sound[60 - 40].CreateInstance();
                buf[5] = m_Sound[64 - 40].CreateInstance();

                for (int i = 0; i <= 5; i++)
               {
                    buf[i].Volume = volume;
                    buf[i].Play();
               }

          }

    }

    2012년 8월 8일 수요일 오전 1:07