2010-04-19 1 views
3

У меня есть это:C# XP Sound QuickFix

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 compitable.

спасибо.

+0

Можете ли вы подтвердить, что переменная Letters всегда содержит то, что соответствует звук имени ресурса _Letters? –

+0

Что произойдет, если вы удалите (по крайней мере временно) блокировку() - блок? Кажется странным, что вы блокируете такой код MUCH на _procLock. Возможно, этот замок блокирует некоторые вещи, которые вы не намеревались :-) –

+0

@Bob: да, я проверил это и проблем там нет. lock() существует для реализации логического потока, то есть не обрабатывать что-либо еще при обработке. – iTEgg

ответ

1

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

http://pastebin.com/aVDWBJ45

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

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

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

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