C++ Frage bzgl. mciSendString

V

VirusDeluXe

Gast
Hallo Tüftler-Kollegen,

ich habe eine generelle Frage zum Thema "mciSendString". Ich benutze momentan folgenden Code:

Code:
	sprintf_s(data, "open %s","player_laser.wav"); 
	mciSendString(data, NULL, 0, NULL);  //Öffnen

	sprintf_s(data, "play %s from 0","player_laser.wav");
	mciSendString(data, NULL, 0, NULL); // Abspielen

	sprintf_s(data, "setaudio %s output volume to 0", NULL, 0, NULL);
	mciSendString(data, NULL, 0, NULL); // Lautstärke
Problem daran ist, dass die "player_laser.wav" knapp 1 Sekunde lang ist. Das heißt, dass er bei der Ausführung den Sound noch in voller Lautstärke ausgibt und der Befehl bzgl. der Lautstärken-Regulierung "zu spät" ankommt. Gibt es eine Möglichkeit den Sound direkt "leiser" abzuspielen?

Ansonsten funktioniert alles wunderbar. Wie gesagt, ist eine generelle Frage.

Vielen Dank schon einmal für die Antworten :-)

Grüße, die freundliche Vire von nebenan
 

antred

Lt. Commander
Dabei seit
Juni 2010
Beiträge
1.288
Werte doch mal den Rückgabewert von mciSendString() aus, um zu sehen, ob er deine Kommandos in der Form überhaupt annimmt.

Wenn ich mir die Doku anschaue, werde ich bei einigen deiner Kommando-Strings ein bißchen skeptisch.

Hier: http://msdn.microsoft.com/en-us/library/windows/desktop/dd798662(v=vs.85).aspx

steht z.B., daß setaudio 3 Parameter hat ... die Device-Id, die Audio-Flags und irgend welche generellen Flags ... bei dir sehe ich aber schon mal keine Device-Id. Und was tust du eigentlich hiermit

Code:
sprintf_s(data, "setaudio %s output volume to 0", NULL, 0, NULL);

sprintf_s() erwartet:

1) Adresse des Puffers, in den geschrieben werden soll.
2) Größe des Puffers
3) Formatstring
ab 4) Argumente die für die Formatspezifizierer im Formatstring eingesetzt werden sollen

Das stimmt ja mal so gar nicht mit dem überein, was du dort angegeben hast.


P.S. Meh, den rot markierten Teil ziehe ich hiermit zurück. Anscheinend hat Microsoft eine Template-Variante von sprintf_s(), die wenn der übergebene Puffer ein Array ist, selbstständig die Arraygröße ermittelt, womit der 2. Parameter - also die Größe des Puffers - entfällt und die nachfolgenden Parameter damit eine Stelle nach vorn rücken.

Selbst so ergibt die Zeile

sprintf_s(data, "setaudio %s output volume to 0", NULL, 0, NULL);

aber letzten Endes den String "setaudio (null) output volume to 0", und das ist bestimmt nicht, was du wolltest.
 
Zuletzt bearbeitet:
V

VirusDeluXe

Gast
Zur Frage bzgl. vertauschen:

Habe ich auch schon versucht, dass interessiert den jedoch nicht. Also er spielt es eiskalt bei voller Lautstärke ab.

Zu der Frage bzgl. wieso der Code so aussieht wie er aussieht:

Hat sich ja erledigt :-) Das Volume auf "0" ergibt zum Testen schon einen Sinn, weil dann würde ich den Sound gar nicht hören und ich wüsste definitiv, dass sich der Sound verändern würde. Das da ein anderer Wert stehen muss, das ist mir bereits klar.

Ansonsten stimmt der String ja auch, weil ich hab zwei Hintergrundlieder, welche perfekt damit funktionieren. Nur für diesen "Minisound" kommt der Befehl "setaudio ..." einfach zu spät.
 
Zuletzt bearbeitet:

antred

Lt. Commander
Dabei seit
Juni 2010
Beiträge
1.288
Wie schon gesagt, Rückgabewerte von mciSendString() auswerten. Du gehst einfach auf gut Glück davon aus, daß er das schon fressen wird, was du ihm da gibst, und davon bin ehrlich gesagt alles andere als überzeugt.
Ergänzung ()

Also ich habe jetzt mal selbst deinen Code ausprobiert. Die ersten 2 mciSendString()-Kommandos nimmt er ohne zu murren an. Das 3. Kommando aber verweigert er wenig überraschend mit Fehlercode 261 (MCIERR_UNRECOGNIZED_COMMAND).
 
V

VirusDeluXe

Gast
Da ist mir ein Copy&Paste-Fehler passiert - löst letztendlich das EIGENTLICHE Problem nach wie vor nicht, weil an diesem Thema sind wir schon lange vorbei ...

Für die, die aber noch eine Weile auf dieser Zeile rumstochern wollen ...:
Code:
sprintf_s(data, "setaudio %s output volume to 0", "player_laser.wav");
 
Top