У меня есть это: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.
спасибо.
Можете ли вы подтвердить, что переменная Letters всегда содержит то, что соответствует звук имени ресурса _Letters? –
Что произойдет, если вы удалите (по крайней мере временно) блокировку() - блок? Кажется странным, что вы блокируете такой код MUCH на _procLock. Возможно, этот замок блокирует некоторые вещи, которые вы не намеревались :-) –
@Bob: да, я проверил это и проблем там нет. lock() существует для реализации логического потока, то есть не обрабатывать что-либо еще при обработке. – iTEgg