Что я должен использовать для замены функции WinAPI Beep ()? - PullRequest
2 голосов
/ 15 июня 2010

У меня есть приложение Visual C ++ / CLI, которое использует звуковые сигналы для обозначения хороших и плохих результатов (используется, когда пользователь не видит экран).

В настоящее время я использую низкие тональные сигналы для плохих результатов и высокие тональные сигналы для хороших результатов:

if( goodResult == true )
{
    Beep(1000, 40);
}
else
{
    Beep(2000, 20);
}

Это нормально работает на моем ноутбуке Vista, но я пробовал его на других ноутбуках, и некоторые, кажется, воспроизводят звуки в течение меньшего времени (они звучат больше как щелчки, чем гудки), или звук не воспроизводится вообще. 1006 *

Итак, у меня здесь два вопроса:

  1. Есть ли более надежная функция звукового сигнала?
  2. Есть ли (простой) способ воспроизвести короткий WAV-файл или нечто подобное (предпочтительное решение).

Ответы [ 5 ]

3 голосов
/ 15 июня 2010

Функция Beep традиционно использовала динамик ПК, и я думаю, что в настоящее время она более или менее устарела.Я предполагаю, что функциональность обрабатывается BIOS ноутбука, и, следовательно, зависит от оборудования.Я предлагаю вам использовать звуковую карту ПК для воспроизведения звука.

Создайте два тона в виде файлов WAV, например, Audacity , а затем воспроизведите их, например, PlaySound .

1 голос
/ 15 июня 2010

Основываясь на ответе Крумелура, я получил довольно аккуратное решение, которое встраивает .wav в исполняемый файл.Он использует SoundPlayer вместо функции PlaySound.

Для проекта Visual C ++ / CLI добавление встроенных ресурсов, кажется, работает немного по-другому, чем другие языки .net поддерживает:

  1. Щелкните правой кнопкой мыши по проекту и выберите Properties.
  2. Перейдите к Configuration Properties -> Linker -> Input.
  3. Добавьте пути к файлам .wav, которые вы хотите встроить (в моемcase, $(ProjectDir)\Audio\PingSend.wav).

Чтобы воспроизвести один из вызовов .wav, просто:

System::IO::Stream^ s = Assembly::GetExecutingAssembly()->GetManifestResourceStream("PingSend.wav");
System::Media::SoundPlayer^ pingPlayer = gcnew System::Media::SoundPlayer(s);
pingPlayer->Play();

.., который должен воспроизводить звук в новом потоке.

0 голосов
/ 15 июня 2010

Функция Windows MessageBeep воспроизводит ошибку по умолчанию, звуковые сигналы OK или системы оповещения с правильными параметрами.Таким образом, фактический воспроизводимый звук и громкость находятся под контролем пользователя, но должны распознаваться как ошибка или ОК.

0 голосов
/ 15 июня 2010
0 голосов
/ 15 июня 2010

Возможно, синтез речи может быть уместным, не уверен, я предполагаю, что ваши пользователи слепы.

http://msdn.microsoft.com/en-us/library/system.speech.synthesis.speechsynthesizer.aspx

...