C # XP Sound QuickFix - PullRequest
       17

C # XP Sound QuickFix

3 голосов
/ 19 апреля 2010

У меня есть это:

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 Ответ

1 голос
/ 26 апреля 2010

SoundPlayer действительно довольно тусклый, но это все, что поставляется с .NET 2.0. Вместо этого попробуйте мой плеер (на основе этой статьи ), который использует MCI для воспроизведения звуков:

http://pastebin.com/aVDWBJ45

Вы можете использовать другие аудиокодеки (например, MP3), и вам нужно только загрузить файл один раз (и не каждый раз, когда вы атакуете, что вызывает задержку). И вы можете воспроизводить звуки асинхронно, не создавая дополнительных потоков.

Это действительно удобно. Просто создайте новый QueuedSamplesPlayer с общим аргументом того, что вы хотите идентифицировать звуки (например, enum, string или int). Используйте метод AddSample для загрузки всех ваших звуков при запуске. Затем используйте Play или PlayAsync, чтобы воспроизвести файл синхронно или асинхронно, соответственно.

Вы можете позвонить PlayAsync несколько раз, и звуки будут воспроизводиться по порядку, один за другим (без блокировки вашей текущей нити). Вы даже можете позвонить PlayAsync во время воспроизведения звука, и он будет добавлен в очередь воспроизведения звука. Когда все звуки закончатся, будет выдано событие QueueEmpty.

Этот плеер был протестирован на Windows XP, Vista и 7.

...