none
DirectX.AudioVideoPlayback.Audio の Endingイベントが発生しません。 RRS feed

  • 質問

  • ─<環境>────────────────────────────

     OS : Windows7 64bit

     ソフト : Microsoft Visual Studio 2005 Academic Edition

     言語 : ManagedDirectX、C#

    ─────────────────────────────────

    MP3ファイルを DirectX.AudioVideoPlayback.Audioに格納し

    最後まで再生したら、Audio.Ending イベントにより先頭から再生するといった

    ループ再生処理を作成したいと考えております。


    現状は本スレッド処理でファイルを読み込み、問題なく動作しておりますが

    読み込み時間短縮のため、BackgroundWorker を用いて

    別スレッドで読み込んだところ、Audio.Ending イベントが実行されない事象が発生しました。

    以下、全体ではありませんが問題部の大まかなソースとなります。

    public Audio sound = null;
    
    [STAThread]
    static void Main() ────────────────
    {    
        // ■■■trueにするとループ再生しない■■■
        bool flg_bg_load = false;
        
        sound = new Audio();
        if (flg_bg_load == true)
        {
            BGwork.RunWorkerAsync();
        }
        else
        {
            sound = Audio.FromFile("./objects/sound.mp3");
            sound.Ending += new System.EventHandler(DX.EndSound);
        }
        
        // サウンド再生
        sound[0].Play();
        
        bool flg_loop = true;
        do
        {                
            // サウンドの再生終了(Ending)を監視
            Application.DoEvents();
            
            // ウィンドウを閉じたら終了
            if (Form.Visible == false) flg_loop = false;
    
        } while (flg_loop == true);
        
        return;
    }
    
    // 別スレッド読み込み ──────────────
    static private void BGwork_DoWork(
        object sender, System.ComponentModel.DoWorkEventArgs e)
    {
        sound = Audio.FromFile("./objects/sound.mp3");
        sound.Ending += new System.EventHandler(EndSound);
    }
    
    // サウンド終了時イベント ────────────
    public void EndSound(object sender, System.EventArgs e)
    {
        Audio audio = (Audio)sender;
        
        if (sound == audio) sound.CurrentPosition = 0;
    }

    自分なりに調べましたが、原因にたどり着くことができませんでしたので

    この現象の理由、ないし調べる方法などアドバイス頂ければと思い質問させて頂きました。

    以上です、ご協力お願い致します。


    • 編集済み tetsuwo 2013年6月11日 6:57
    2013年6月11日 6:56

すべての返信

  • 細かく検証していません。

    Main内部でPlayを呼び出していますがBGwork_DoWork呼び出しの前に実行されてしまっていませんか?

    Play呼び出しをBGwork_DoWorkの中に移動させたらどうでしょう。


    • 編集済み 謎人 2013年6月11日 11:09
    2013年6月11日 11:08
  • >> 謎人さま

    ご回答ありがとうございます。2つの事を試しましたが、解決には至りませんでした。

      ① BGwork_DoWork 内での Play 呼び出し

      ② Mainでの Play 呼び出し行を変更

        sound.Play();    →    while (sound == null) { } sound.Play();

    2013年6月11日 22:13