Библиотека Audiere делает это чрезвычайно простым делом. Вот почти полная программа на C # для генерации тона DTMF для кнопки «1»:
AudioDevice device = new AudioDevice();
OutputStream tone1a = device.CreateTone(697); // part A of DTMF for "1" button
OutputStream tone1b = device.CreateTone(1209); // part B
tone1a.Volume = 0.25f;
tone1b.Volume = 0.25f;
tone1a.Play();
tone1b.Play();
Thread.Sleep(2000);
// when tone1a stops, you can easily tell that the tone was indeed DTMF
tone1a.Stop();
Чтобы использовать Audiere в C #, самый простой способ начать работу - использовать привязку Харальда Филкера C # (которая, как он утверждает, работает на Mono и VS; я могу это подтвердить работает как в полной версии VS2005, так и с использованием отдельных версий Express 2008 (C # и VC ++). Вам нужно будет загрузить Win32 Audiere DLL, lib и заголовок (которые находятся в одном и том же zip-файле), и вам нужно будет создать привязку C # из исходного кода, используя как VC ++, так и C #.
Одним из приятных преимуществ использования Audiere является то, что звонки не блокируются. Вам не нужно ждать, пока tone1a
прекратит играть, прежде чем начинать tone1b
, что явно необходимо для воспроизведения сложных тонов. Я не знаю каких-либо жестких верхних ограничений на количество одновременных потоков вывода, которые вы можете использовать, так что это, вероятно, то, что поддерживает ваше оборудование / ОС. Кстати, Audiere также может воспроизводить определенные аудиофайлы (MP3, WAV, AIFF, MOD, S3M, XM, IT; Ogg Vorbis, Flac, Speex с внешними библиотеками), а не только чисто сгенерированные тоны.
Одним из возможных недостатков является то, что при запуске или остановке отдельного тона слышен слегка слышимый «щелчок»; это не заметно, если добавить один тон к уже воспроизводимому. Самый простой обходной путь, который я нашел для этого, - это медленно увеличивать или уменьшать громкость тона при включении или выключении тона соответственно. Возможно, вам придется поиграть со скоростью рампы, чтобы она звучала «точно».
Обратите внимание, что Audiere имеет лицензию LGPL, и к привязке не прикреплено никакой лицензии. Вам нужно будет проконсультироваться со своей юридической командой или попытаться завладеть Харальдом, если вы хотите использовать его связывание в коммерческом продукте; или вы можете просто сделать свой собственный переплет и избежать хлопот.
@Tom: Поскольку к библиотеке Харальда не прилагается конкретная лицензия, я не уверен, каковы будут последствия ее размещения; однако, я полагаю, что могу, по крайней мере, дать вам подробную информацию о том, как именно настроен мой проект libaudieresharpglue.
Используя Visual C ++ Express 2008, откройте bindings/csharp/libaudieresharpglue/vc8.0/libaudieresharpglue.sln.
VC ++ автоматически преобразует решение в решение VS9.
В другой папке у вас должен быть пакет Audiere от Sourceforge. В свойствах вашего проекта VC ++ перейдите в Свойства конфигурации> C / C ++> Общие и убедитесь, что у вас есть path/to/audiere-1.9.4-win32/include
в ваших «Дополнительных каталогах включения». Затем в том же окне перейдите в Linker> General и убедитесь, что у вас есть /path/to/audiere-1.9.4-win32/lib
в ваших «Дополнительных каталогах библиотеки». Затем вы сможете собрать проект (желательно в режиме Release) и вывести libaudieresharpglue.dll
в вашу папку vc8.0/Release
.
Затем откройте Visual C # Express 2008. Откройте bindings\csharp\test\vc8.0\AudiereCSharpTest.sln
и дайте ему преобразовать решение. Проект должен работать нормально, но при запуске вы получите ошибку. Все в порядке; в вашей папке csharp/test/vc8.0/bin/Release
необходимо добавить как libaudieresharpglue.dll из решения VC ++, так и audiere.dll из пакета от Sourceforge.
Теперь вы сможете собрать и запустить AudiereCSharpTest. Обратите внимание, что по умолчанию #define stream_test
не закомментировано в верхней части AudiereTest.cs, и это будет ссылаться на файл, который не находится на вашем жестком диске. Вы можете просто закомментировать это #define
и раскомментировать noise_test
или square_test
.
Это должно покрыть это; если я пропустил какие-либо детали, надеюсь, они достаточно малы, чтобы обойтись самостоятельно:)