Biblioteka Audiere czyni to niezwykle łatwe do zrobienia. Oto prawie kompletna C# program wygeneruje sygnał DTMF za pomocą przycisku „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();
Aby korzystać Audiere w C#, najprostszym sposobem, aby wstać i uruchomiony jest użycie Harald Fielker's C# binding (który twierdzi, że prace nad Mono i VS; mogę potwierdzić, że działa zarówno w pełnej wersji VS2005, jak i przy użyciu oddzielnych wersji C# i VC++ Express 2008). Musisz pobrać Win32 Audiere DLL, lib, and header (wszystkie są w tym samym pliku zip), a będziesz musiał zbudować wiązanie C# ze źródła przy użyciu zarówno VC++, jak i C#.
Jedną z zalet korzystania z Audiere jest to, że połączenia nie są blokowane. Nie musisz czekać, aż tone1a
przestanie grać przed uruchomieniem tone1b
, co jest oczywiście koniecznością do odtwarzania złożonych dźwięków. Nie mam informacji o żadnych twardych górnych limitach na ile równoczesnych strumieni wyjściowych można użyć, więc prawdopodobnie to, co obsługuje sprzęt/system operacyjny. Przy okazji, Audiere może również odtwarzać pewne pliki audio (MP3, WAV, AIFF, MOD, S3M, XM, IT samodzielnie, Ogg Vorbis, Flac, Speex z bibliotekami zewnętrznymi), a nie tylko czyste wygenerowane dźwięki.
Jedną z możliwych wad jest to, że po rozpoczęciu lub zatrzymaniu pojedynczego tonu słychać "kliknięcie"; nie jest to zauważalne, jeśli dodasz jeden ton do już odtwarzanego dźwięku. Najłatwiejszym sposobem na rozwiązanie tego problemu jest stopniowe zwiększanie lub zmniejszanie głośności tonów, gdy odpowiednio włączasz lub wyłączasz dźwięk. Być może będziesz musiał grać z prędkością rampy, aby uzyskać dźwięk "w sam raz".
Należy pamiętać, że Audiere ma licencję LGPL, a oprawa nie jest do niej dołączona. Będziesz musiał skonsultować się ze swoim zespołem prawnym lub spróbować zdobyć Haralda, jeśli chcesz użyć jego wiązania w produkcie komercyjnym; lub możesz po prostu stworzyć własne wiązanie i uniknąć kłopotów.
@Dom: Ponieważ nie ma konkretnej licencji dołączonej do biblioteki Haralda, nie jestem pewien, jakie będą konsekwencje jego hostowania; jednak uważam, że mogę przynajmniej podać dokładne szczegóły na temat tego, w jaki sposób został ustawiony mój projekt libaudieresharpill.
Przy użyciu Visual C++ Express 2008, otwórz bindings/csharp/libaudieresharpglue/vc8.0/libaudieresharpglue.sln.
VC++ automatycznie przekonwertuje rozwiązanie na rozwiązanie VS9.
W innym folderze powinieneś mieć pakiet Audiere z Sourceforge. Pod właściwościami projektu VC++ przejdź do Właściwości konfiguracji> C/C++> Ogólne i upewnij się, że masz path/to/audiere-1.9.4-win32/include
w swoich "Katalogach uwzględniania dodatkowych". Następnie, w tym samym oknie, przejdź do Linker> Ogólne i upewnij się, że masz /path/to/audiere-1.9.4-win32/lib
w "Dodatkowe katalogi biblioteczne". Następnie powinieneś być w stanie zbudować projekt (najlepiej w trybie Release) i to wyjście libaudieresharpglue.dll
w swoim folderze vc8.0/Release
.
Następnie otwórz program Visual C# Express 2008. Otwórz pakiet bindings\csharp\test\vc8.0\AudiereCSharpTest.sln
i pozwól mu go przekonwertować. Projekt powinien być dobrze zbudowany, ale wtedy pojawi się błąd, gdy go uruchomisz. W porządku; w twoim folderze csharp/test/vc8.0/bin/Release
, musisz dodać zarówno libaudieresharpglue.dll z rozwiązania VC++, jak i audiere.dll z pakietu z Sourceforge.
Teraz powinieneś być w stanie zbudować i uruchomić AudiereCSharpTest. Zauważ, że domyślnie #define stream_test
nie jest komentowany na górze AudiereTest.cs, a to odwołuje się do pliku, który nie znajduje się na dysku twardym. Możesz po prostu skomentować, że #define
i odkomentować noise_test
lub square_test
.
To powinno go obejmować; jeśli przegapiłem jakieś szczegóły, mam nadzieję, że są one wystarczająco małe, aby można je było wykonać samodzielnie :)
Dla twojej informacji, używanie głośnika komputera (w przypadku sygnałów dźwiękowych) zwykle nie jest dobrą praktyką. Powinieneś użyć domyślnego wyjścia audio. – decasteljau
Właściwie wolałbym używać domyślnego wyjścia audio. W końcu * będzie * potrzebna, aby przejść przez słuchawki. –
To ważna kwestia. Zapomnij o dźwięku. Chcesz użyć DirectSound lub WaveOut. Oba są niezarządzanymi interfejsami API, więc musisz albo użyć PInvoke, albo przełączyć się na C++/CLI jako swój język. – CannibalSmith