Neuer PC-Standard: High Definition Audio - Teil 2

29.07.2004
In Intels aktuellen Chipsätzen sorgt erstmalig HD-Audio mit Dolby Digital EX, 7.1 Surround-Sound und parallelen Streams für ein neues Hörerlebnis. Wir erläutern die Details und die Programmierung des neuen Standards. Von Jim Huang und Matt Mc Clellan

Fortsetzung von Ausgabe 30/04, Seite 37

Demoprogramm und Codebeispiele

Die folgende Liste nennt die wichtigsten Stufen, die ein Software-Entwickler für HD-Audio beachten muss. Dies gilt insbesondere, da sich die Konfiguration eines HD-Audio-PC ständig dynamisch ändern kann.

Notwendige Schritte beim Öffnen der Applikation:

- Ermitteln von Wiedergabe- und Aufnahmegeräten

- Speichern der verfügbaren Wiedergabe- und Aufnahmegeräte

- Wiederherstellen der beim letzten Programmaufruf gespeicherten Settings für Wiedergabe- und Aufnahmegeräte

Notwendige Schritte beim Schließen der Applikation:

- Speichern der aktuellen Settings in der Registry

- Freigeben aller Geräte

Die auf den nächsten Seiten folgenden Codebeispiele und der entsprechende Code von Intel zum Download (http://www.intel.com/cd/ids/developer/asmo-na/eng/downloads/code/languages/95211. htm) zeigen, wie Audio-Geräte zu ermitteln sind, wie Audio-Inhalte über mehrere Geräte abgespielt werden und schließlich wie eine Liste von Audio-Geräten geführt und per Update aktuell gehalten wird.

Initialisieren eines DirectSound-Objekts

Dieser Abschnitt zeigt die Initialisierung, wenn Ihre Applikation die PlaySound()-Funktion nutzt, um Audio-Sound über den Default-Port abzuspielen. Da PlaySound() nicht das DirectX-API benutzt, muss der C/C++-Code das DirectX-COM-Objekt erzeugen, ehe die Applikation vom DirectSound-API profitieren kann. Das folgende Codebeispiel zeigt, wie die benötigten COM-Objekte erzeugt werden.

// Instantiate an interface to query the sound devices.

if( FAILED( hr = CoCreateInstance( CLSID_DirectMusicLoader, NULL, CLSCTX_INPROC, IID_ IDirectMusicLoader8, (void**)&m_pLoader ) ) )

return hr; // Create a new music object

if( FAILED( hr = CoCreateInstance( CLSID_DirectMusicPerformance, NULL, CLSCTX_INPROC, IID_IDirectMusicPerformance8,(void**)&m_pPerformance ) ) ) return hr;

Das IID_IDirectMusicLoader8-Interface wird genutzt zum Auffinden, Auflisten, Speichern und Laden der Objekte. Im Codebeispiel wird dieses Objekt zum Laden einer Audio-Datei benutzt.

Das IID_IDirectMusicPerformance8-Interface wird hauptsächlich als allgemeiner Wiedergabe-Manager eingesetzt. Das Codebeispiel zum Download nutzt dieses Interface, um das Audio-Objekt auf dem Wiedergabegerät zu initialisieren, den Audio-Stream zu starten und zu stoppen, den Status des Audio-Streams zu prüfen und die Geräte freizugeben.

Suchen nach Geräten

Um HD-Audio zu ermöglichen, muss im ersten Schritt das System nach den verfügbaren Wiedergabe- und Aufnahmegeräten abgefragt werden. Da die HD-Audio-Spezifikation es erlaubt, Ports wiederzuverwenden, ist es wichtig, beim Öffnen der Applikation die Geräte abzufragen, aufzulisten und mit den bereits gespeicherten Settings zu versehen. Die Suche nach verfügbaren Geräten ist unkompliziert und benötigt nur wenig zusätzlichen Code.

Der folgende Code demonstriert, wie das System nach verfügbaren Wiedergabegeräten abgefragt wird.

if( FAILED( hr = DirectSoundEnumerate( (LPDSENUMCALLBACK)DSoundEnumCallback,(VOID*)this ) ) )

return DXTRACE_ERR_MSGBOX( TEXT("DirectSoundEnumerate"), hr );

Die DirectSoundEnumerate()-Funktion ist eine DirectSound-Funktion, die ein Callback für jedes verfügbare Wiedergabegerät generiert. Beachten Sie, dass sich im ersten Parameter die Callback-Funktion DSoundEnumCallback() findet. Die Callback-Funktion wird für jedes im System installierte Wiedergabegerät einzeln aufgerufen. Da die HD-Audio-Spezifikation es erlaubt, Ports wieder zu verwenden, variiert die Anzahl der Callbacks abhängig von der Systemkonfiguration. Der zweite Parameter ist der anwenderdefinierte Kontext. Im Codebeispiel wird dieser Parameter benutzt, um zu bestimmen, in welche Listbox die Callback-Informationen eingetragen werden.

Falls Ihre Applikation oder Ihr Spiel Spracheingabe erfordert oder Audio-Inhalte aufzeichnet, funktioniert die Suche nach den Input-Geräten ähnlich wie die nach den Wiedergabegeräten.

if( FAILED( hr = DirectSoundCaptureEnumerate( (LPDSENUMCALLBACK)DSoundEnumCallback,(VOID*)this ) ) )

return DXTRACE_ERR_MSGBOX( TEXT("DirectSoundCaptureEnumerate"), hr );

Auswählen der Wiedergabegeräte

Nachdem das System nach verfügbaren Geräten gesucht hat, muss es die Liste der Geräte im Arbeitsspeicher ablegen und dem Anwender für die Konfiguration und Auswahl präsentieren. Auch Applikationen, die nur einen Audio-Stream nutzen, sollten es dem Anwender ermöglichen, die Wiedergabegeräte selbst auszuwählen, statt auf die Default-Geräte zurückzugreifen.

Das erlaubt dem Anwender, seine Umgebung selbst zu konfigurieren und beispielsweise Musik über Kopfhörer abzuspielen, während der System-Sound über die Lautsprecher ausgegeben wird. Zukünftige Applikationen und Spiele sollten diesen Vorteil HD-Audio-fähiger PC-Systeme nutzen und dem Anwender die Kontrolle darüber überlassen, welches Wiedergabegerät er wofür einsetzt. Das folgende Codesegment zeigt, wie eine Audio-Datei geladen und einem Wiedergabegerät zugewiesen wird.

// Load the filename into the DirectMusicLoader object.

hr = m_pLoader->LoadObjectFromFile (CLSID_DirectMusicSegment, IID_IDirectMusicSegment8, wstrFileName, (LPVOID*) &m_pSegment );

// Initialize the audio path and attach the selected playback device to the path

hr = m_pPerformance->InitAudio ((IDirectMusic **)&m_pDirectMusic8, (IDirectSound **)&p DS8, m_hParentWnd, DMUS_APATH_DYNAMIC_STEREO, 128, DMUS_AUDIOF_ALL, NULL ) ;

Das Codebeispiel zum Download kreiert so ein Objekt für jeden Stream und managt jeden Stream unabhängig von den anderen Streams.

Beispielanwendung

Der begleitende Quellcode zum Download (/www.intel.com/cd/ids/developer/asmo-na/eng/downloads/code/languages/95211. htm) von Intel demonstriert, wie mehrere Audio-Dateien über dasselbe Wiedergabegerät oder über mehrere Geräte gesucht und abgespielt werden. Ehe Sie den Quellcode herunterladen und die Datei erstellen, überprüfen Sie, ob Sie die folgende Entwicklungsumgebung installiert haben:

- Microsoft Visual Studio 6.0 mit Servicepack 5 oder Microsoft Visual Studio .Net 2003 (Beachten Sie dazu die folgenden Anmerkungen)

- Microsoft DirectX 9.0 SDK

Das Originalbeispiel von Intel lässt sich unter Visual Studio .Net 2003 nicht sofort kompilieren. Laden Sie sich deshalb zusätzlich die zwei von uns überarbeiteten Datei

en (www.tecchannel.de/download/1433/VS_Net_2003_Update.zip) herunter und tauschen Sie diese gegen die Originale von Intel aus.

Ihr PC-System benötigt mehrere Sound-Karten, um parallel Audio-Dateien an unterschiedlichen Lautsprechern ausgeben zu können. Alternativ können Sie auch ein System mit "echtem" High Definition Audio benutzen.

Erstellen der Beispielanwendung

Erfüllt Ihre Entwicklungsumgebung alle Voraussetzungen, befolgen Sie diese Schritte.

- Laden Sie den HD-Audio-Quellcode herunter.

- Entpacken Sie die Zip-Datei und speichern Sie die Daten in ein Verzeichnis (etwa: HDAudioSample). Die komprimierte Datei enthält bereits ein Verzeichnis, damit sichergestellt ist, dass die Daten wirklich in einem Subdirectory gespeichert werden.

- Öffnen Sie Microsoft Visual Studio 6.0.

- Wählen Sie die Datei "Open Workspace from Visual Studio 6.0".

- Ändern Sie die Dateitypen im Open-Workspace-Dialog zu "Projects (.dsp) for Files of type".

- Öffnen Sie "AzaliaDemo.dsp".

- Erstellen Sie das Projekt.

Falls Sie mit dem Visual Studio .Net 2003 arbeiten, müssen Sie nach dem Entpacken noch die beiden von tecCHANNEL modifizierten Dateien herunterladen (www.tecchannel.de/download/1433/VS_ Net_2003_Update.zip) und im Codeverzeichnis austauschen. Öffnen Sie anschließend die Datei AzaliaDemo.dsp. In der erscheinenden Dialogbox lassen Sie alle Dateien in das Format von Visual Studio .Net 2003 konvertieren. Bevor Sie das Projekt erstellen können, müssen Sie nur noch das Header- und Lib-Verzeichnis des DirectXx-SDKs bei den Projekteigenschaften angeben.

Über die Autoren: Jim Huang ist Senior Technical Marketing Engineer, Matt McClellan Senior Application Engineer bei Intel.

Dieser Artikel wurde erstmals im Intel Developer Service (www.intel. com/IDS) veröffentlicht. Die deutsche Zweitverwertung erfolgt mit Genehmigung von Intel.

(Übersetzt von Britta Mümmler, überarbeitet und aktualisiert von Albert Lauchner)

tecCHANNEL-COMPACT "ITechnologie-Ratgeber 2004"

tecChannel.de ist die Nummer eins der Online-Fachmedien in Deutschland (IVW 1/04). Auf www.tecChannel.de finden Sie mehr als 1.700 Beiträge und über 14.000 News zu allen Themen der IT. Das kostenlose Online-Programm wird ergänzt durch das noch umfangreichere kostenpflichtige tecCHANNEL-Premium- und die tecCHANNEL-Compact-Buchreihe.

Im neuen tecCHANNEL-Compact "ITechnologie-Ratgeber 2004" finden professionelle Anwender auf über 220 Seiten Grundlagen, Know-how-, Ratgeber- und Praxisbeiträge.

Insbesondere im Server-, Desktop- und Mobile-Bereich steht ein Generationswechsel bevor. Die Einführung von PCI Express und neuen CPUs, wie Pentium 4 "Prescott" und Pentium M "Centrino", 64-Bit-Computing, sowie der DDR2-Speichertechnologie und Serial Attached SCSI verunsichert die IT-Branche. Die tecCHANNEL-Redaktion beantwortet die Fragen, welche Technologien zukunftssicher sind und die bevorstehenden Investitionen schützen und was beim Umstieg zu beachten ist.

Die Ausgabe ist ab sofort im Handel zu haben oder direkt im Online-Shop unter

www.tecChannel.de/shop für 9,90 Euro (gegen Rechnung) inklusive Versandkosten zu bestellen.

Zur Startseite