[C++] Windows Lautsprechereinst. umstellen (5.1->Stereo)

Spartaner117

Lt. Commander
Registriert
Feb. 2005
Beiträge
1.299
Hi,

ich würd gern ein Programm schreiben, welches bei bestimmten Ereignissen die Windowslautsprechereinstellungen von den standardmäßigen 5.1 auf Stereo umstellt, damit ich im Headset nicht hinten taub bin.

Jetzt hab ich aber keine Ahnung an welchem Punkt ich ansetzen muss, um diese Einstellungen zu ändern, Google und diverse Programmier-Portale haben nix ergeben.

Edit: Mittlerweile hab ich doch was gefunden. Aber es tut nicht. Er findet die Memberfunktion SetSpeakerConfig nicht. Ideen?
 
Zuletzt bearbeitet:
Findet der Compiler die Methode nicht, oder kann der Linker nicht linken?
Im ersten Fall müsste ein #include "dsound.h" helfen.
Im zweiten Fall müsste dem Linker gesagt werden, dass er gegen die DirectX Bibliothek linken soll.
 
Oh, ganz vergessen die Compilermeldung reinzukopieren.

Bei folgendem Code:

Code:
#include <iostream>
#include <dsound.h>

using namespace std;

int main()
{
    SetSpeakerConfig(DSSPEAKER_5POINT1);
    
    return 0;
}
error C3861: 'SetSpeakerConfig': identifier not found, even with argument-dependent lookup
Wenn ich die Klasse mit angebe, also

Code:
IDirectSound8.SetSpeakerConfig(DSSPEAKER_5POINT1);
sagt er

error C2143: syntax error : missing ';' before '.'
error C2143: syntax error : missing ';' before '.'
Werd daraus nicht schlau.

Edit: Wobei das nicht gehen kann *duck*. Ist ja garkeine Klasseninstanz. Oder wie? Oder was?
Aber welche Instanz nehm ich dann? Müsste ja eigendlich mindestens eine da sein.
 
Zuletzt bearbeitet:
Ich glaube garnicht, dass dir DSound da viel bringt, denn das wird den Modus (afaik) nur innerhalb der DX Anwendung so setzen.
Meiner Meinung nach müsstest du da schauen ob der Soundkartenhersteller ein SDK anbietet oder er Informationen zum ansprechen des Treibers anbietet. Und sonst... selbst einen Treiber programmieren. ;)

mfg

/edit: ok stimmt nicht, hätte mal lesen sollen. Aber mit Treiber ansprechen könntest du es trotzdem versuchen.
 
Zuletzt bearbeitet:
In der MSDN steht:

Note This function controls a global Windows setting that affect all users and applications on the system. It is provided only for use by configuration utilities provided by audio device vendors. No other applications should call it.

Es sollte also schon gehen.
Sollte, wie gesagt...
 
Vermutlich musst du zuerst das IDirectSound8 Interface per DirectSoundCreate8 erstellen und dann mit diesem SetSpeakerConfig aufrufen.
 
Danke für den Link Götterwind, aber in der MSDN hab ich das ganze schon gefunden.
(Ist im ersten Post von mir auch verlinkt. ;) )

Ich werd morgen mal Raechaers Tipp ausprobieren.

Edit: Konnte doch nicht warten und habs noch schnell ausprobiert.
Ich bin jetzt soweit:

Code:
#include <iostream>
#include <dsound.h>

using namespace std;

int main()
{
    LPDIRECTSOUND8 * ptrDSoundInst;
    DirectSoundCreate8( NULL, ptrDSoundInst, NULL);
    ptrDSoundInst->SetSpeakerConfig(DSSPEAKER_5POINT1);
    
    return 0;
}

Der Compiler meint dazu:
error C2227: left of '->SetSpeakerConfig' must point to class/struct/union
type is 'LPDIRECTSOUND8 * '

Und nun geh ich schlafen. Gute Nacht miteinander.:)
 
Zuletzt bearbeitet:
Ich habe gerade keinen Compiler in der Nähe zum Testen, aber sollte das nicht eher so aussehen:

Code:
LPDIRECTSOUND8 ptrDSoundInst;
DirectSoundCreate8( NULL, &ptrDSoundInst, NULL);
ptrDSoundInst->SetSpeakerConfig(DSSPEAKER_5POINT1);
 
Ha! Es geht. Zumindest gibt es keinen Compilerfehler.
Es lag daran dass ich die dsound.lib nicht verlinkt hatte. *shame on me*

@Raechaer: Du hast recht mit deiner Syntax. Nur zum Verständnis: Warum so und nicht wie ich es versucht habe?

Als Parameter will die Funktion doch genau den Pointer, den ich drüber deklariert hab.
Ohne * Operator übergeb ich ja auch die gefragte Adresse (oder nicht?).
Und warum benutzt du dann unten den -> Operator, es handelt sich ja nun nicht um einen Pointer auf eine Klasseninstanz? :freak:

Trotzdem natürlich danke an alle die mit zur Lösung beigetragen haben.
 
Das Interface das du haben willst ist ein Zeiger (vom Typ LPDIRECTSOUND8, LP in Microsoft Typen bedeutet immer Zeiger, wahrscheinlich könntest du auch DIRECTSOUND8* verwenden), deshalb solltest du das Interface auch als solches deklarieren und nicht als LPDIRECTSOUND8 *.

DirectSoundCreate8() muss nun diesen Zeiger so umbiegen, dass er auf eine Instanz der DIRECTSOUND8 Klasse zeigt. Da C++ aber call by value verwendet kannst du nicht einfach deinen Zeiger übergeben (denn dann würde nur die Kopie des Zeigers auf die Instanz zeigen) sondern stattdessen musst du einen Zeiger auf deinen Zeiger übergeben um call by reference zu simulieren (und mit der Kopie des Zeigers auf den Zeiger kann dann auf deinen wirklichen Zeiger zugegriffen werden und diesem der richtige Wert zugewiesen werden).

Hoffe das macht das Ganze etwas verständlicher, Zeiger auf Zeiger (auf Zeiger auf....) können manchmal recht verwirrend sein :)
 
Ahaa, das macht die ganze Sache schon etwas klarer.

Öhm, und ich will ja nicht nerven, aber es stellt sich ein neues Problem.
Es geht jetzt soweit. Man kann über die Systemsteuerung>Sound etc die Veränderung sehen.
Aber das Problem ist jetzt, dass es keine Änderung hervorruft.
Es kommt nachwievor Ton aus den Rear-Lautsprechern.
Muss ich zum ändern dieser Einstellung neustarten?
Wenn ja, dann könnte ich den ganzen Kram in die Tonne treten. :(
 
Es kann gut sein, dass deine Anlage, wenn du auf Stereo stellst auf den Rear-Boxen das gleiche wie vorne abspielt. Also kein echtes 5.1 sondern Stereo-Fake-5.1 ;) Kannst ja mal hören.
 
Zurück
Oben