C#XP声音QuickFix

时间:2010-04-19 11:14:05

标签: c# audio windows-xp playback

我有这个:

ThreadPool.QueueUserWorkItem(new WaitCallback(FireAttackProc), fireResult);

和FireAttackProc:

    private void FireAttackProc(Object stateInfo)
    {
        // Process Attack/Fire (local)
        lock (_procLock)
        {
            // build status message
            String status = "(Away vs. Home)";

            // get Fire Result state info
            FireResult fireResult = (FireResult)stateInfo;

            // update home grid with attack information
            GameModel.HomeCellStatusSet(fireResult.FireGridLocation, Cell.cellState.Lock);
            this.Invoke(new Action(delegate() { RefreshHomeGrid(); }));

            status = status + "(Attack Coordinate: (" + GameModel.alphaCoords(fireResult.FireGridLocation.Column) +
                "," + fireResult.FireGridLocation.Row + "))(Result: ";

            // play audio data if true
            if (audio)
            {
                String Letters;

                Stream stream;
                SoundPlayer player;

                Letters = GameModel.alphaCoords(fireResult.FireGridLocation.Column);
                stream = Properties.Resources.ResourceManager.GetStream("_" + Letters);
                player = new System.Media.SoundPlayer(stream);
                player.PlaySync();


                Letters = fireResult.FireGridLocation.Row.ToString();
                stream = Properties.Resources.ResourceManager.GetStream("__" + Letters);
                player = new System.Media.SoundPlayer(stream);
                player.PlaySync();

                stream.Dispose();
                player.Dispose();
            }

            if (audio)
            {
                SoundPlayer fire = new SoundPlayer(Properties.Resources.fire);
                fire.PlaySync();
                fire.Dispose();
            }

            // deal with hit/miss
            switch (fireResult.Hit)
            {
                case true:
                    this.Invoke(new Action(delegate()
                    {
                        GameModel.HomeCellStatusSet(fireResult.FireGridLocation, Cell.cellState.Hit);
                        status = status + "(Hit)";
                    }));

                    if (audio)
                    {
                        SoundPlayer hit = new SoundPlayer(Properties.Resources.firehit);
                        hit.PlaySync();
                        hit.Dispose();

                    }
                    break;

                case false:
                    this.Invoke(new Action(delegate() 
                    {
                        GameModel.HomeCellStatusSet(fireResult.FireGridLocation, Cell.cellState.Miss);
                        status = status + "(Miss)";
                    }));

                    GameModel.PlayerNextTurn = NietzscheBattleshipsGameModel.GamePlayers.Home;

                    if (audio)
                    {
                        SoundPlayer miss = new SoundPlayer(Properties.Resources.firemiss);
                        miss.PlaySync();
                        miss.Dispose();
                    }
                    break;
            }

            // refresh home grid with updated data
            this.Invoke(new Action(delegate() { RefreshHomeGrid(); }));

            GameToolStripStatusLabel.Text = status + ")";

            // deal with ship destroyed
            if (fireResult.ShipDestroyed)
            {
                status = status + "(Destroyed: " + GameModel.getShipDescription(fireResult.DestroyedShipType) + ")";

                if (audio)
                {
                    Stream stream;
                    SoundPlayer player;

                    stream = Properties.Resources.ResourceManager.GetStream("_home");
                    player = new System.Media.SoundPlayer(stream);
                    player.PlaySync();
                    player.Dispose();
                    stream.Dispose();

                    string ShipID = fireResult.DestroyedShipType.ToString();
                    stream = Properties.Resources.ResourceManager.GetStream("_" + ShipID);
                    player = new System.Media.SoundPlayer(stream);
                    player.PlaySync();
                    player.Dispose();
                    stream.Dispose();

                    stream = Properties.Resources.ResourceManager.GetStream("_destroyed");
                    player = new System.Media.SoundPlayer(stream);
                    player.PlaySync();
                    player.Dispose();
                    stream.Dispose();
                }
            }

            // deal with win condition
            if (fireResult.Win)
            {
                if (audio)
                {
                    Stream stream;
                    SoundPlayer player;

                    stream = Properties.Resources.ResourceManager.GetStream("_home");
                    player = new System.Media.SoundPlayer(stream);
                    player.PlaySync();
                    player.Dispose();

                    stream = Properties.Resources.ResourceManager.GetStream("_loses");
                    player = new System.Media.SoundPlayer(stream);
                    player.PlaySync();
                    player.Dispose();
                }

                GameModel.gameContracts = new GameContracts();
            }

            // update status message
            if (fireResult.Hit)
            {
                if (!fireResult.Win)
                {
                    status = status + "(Turn: Away)";

                    LockGUIControls();
                }
            }

            // deal with turn logic
            if (GameModel.PlayerNextTurn == NietzscheBattleshipsGameModel.GamePlayers.Home)
            {
                this.Invoke(new Action(delegate()
                {
                    if (!fireResult.Win)
                    {
                        status = status + "(Turn: Home)";

                        AwayTableLayoutPanel.Enabled = true;
                    }
                }));
            }

            // deal with win condition
            if (fireResult.Win)
            {
                this.Invoke(new Action(delegate()
                {
                    status = status + "(Game: Home Loses)";

                    CancelToolStripMenuItem.Enabled = false;
                    NewToolStripMenuItem.Enabled = true;
                    LockGUIControls();
                }));
            }

            // display completed status message
            GameToolStripStatusLabel.Text = status + ")";
        }
    }

问题在于:

在Vista / win7下,FireAttackProc中的声音片段播放。

但是在XP下,FireAttackProc中包含的逻辑被执行但没有声音片段播放。

有没有快速解决方案,所以声音会在XP下播放?

我要求快速解决方案,因为我很高兴能够在Vista / Win7中完全执行,但如果有快速解决方案会很好,所以它也可以兼容XP。

谢谢。

1 个答案:

答案 0 :(得分:1)

SoundPlayer真的很黯淡,但这就是.NET 2.0所带来的。尝试使用我的播放器(基于this article),它使用MCI播放声音:

http://pastebin.com/aVDWBJ45

您可以使用其他音频编解码器(例如MP3),并且您只需加载一次文件(而不是每次攻击时都会加载,这会导致延迟)。并且您可以异步播放声音而无需创建其他线程。

它非常易于使用。只需创建一个新的QueuedSamplesPlayer,其中包含您要识别声音的通用参数(例如enumstringint)。使用AddSample方法在启动时加载所有声音。然后使用PlayPlayAsync分别同步或异步播放文件。

您可以多次拨打PlayAsync,声音会按顺序播放,一个接一个播放(不会阻止您当前的话题)。您甚至可以在播放声音时拨打PlayAsync,然后将其添加到要播放的声音队列中。当所有声音播放完毕后,将引发QueueEmpty事件。

此播放器已在Windows XP,Vista和7上进行过测试。