MMSystem waveOutOpen

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
schoschy
Beiträge: 56
Registriert: Di 18. Okt 2022, 15:46

MMSystem waveOutOpen

Beitrag von schoschy »

Ich versuche gerade einen Ton auf einem definierten Audiodevice mit MMSystem abzuspielen.
Plan war:

Code: Alles auswählen

uses
  ...,
  MMSystem;
...  
waveOutOpen(@Handle, device, @WaveFormatEx, 0, 0 , 0);
sndPlaySound(sinMS.Memory, SND_MEMORY or SND_SYNC);
waveOutClose(device);
Der Sinus kommt wunderbar auf meinem aktiven Lautsprecher, nicht auf dem Headset, wessen device_id sich hinter der Variable befindet.
Also das ganze um MMRESULT erweitert um von Open und Close die rückgabewerte zu erhalten.
Open hat 0 => const MMSYSERR_NOERROR = 0;


Hat jemand Erfahrung hiermit und kann mir auf die Sprünge helfen, habe mit Audio bisher nichts gemacht.
Ich erstell eben mal ein Testprogramm, um das Problem zu verdeutlichen.
Dateianhänge
project1.zip
(2.95 KiB) 28-mal heruntergeladen

siro
Beiträge: 758
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 11
CPU-Target: 64Bit
Wohnort: Berlin

Re: MMSystem waveOutOpen

Beitrag von siro »

probier mal:

device := WAVE_MAPPER; // SIRO vorher war es 2; // ändern der Variable ohne veränderung

Bei 2 gibt es folgende Ausgabe bei mir:
openResultCode:2 ,closeResultCode:5

Bei WAVE_MAPPER gibt es folgende Ausgabe bei mir:
openResultCode:0 ,closeResultCode:0

funktionieren (akustisch) beide Varianten bei mir über die Boxen
und wenn ich den Kopfhörer reinstecke eben über den Kopfhörer.

---
habe grad mal
IntToStr(WaveOutGetNumDevs);
probiert.
auf dem Programmier PC wird 2 ausgegeben
auf meinem Musik PC 13

Es könnte also sein, dass bei Dir (bzw. Soundkarte) auch mehrere Ausgabekanäle existieren,
die mit einer entsprechenden Nummer DeviceId angesprochen werden müssen.

So habe ich eben mal die Device id's durchgespielt:
Bei meinem Musik PC device = 0..12 wird jeweils
openResultCode:0 ,closeResultCode:0
ausgegeben,
ab device=13 wird
openResultCode:2 ,closeResultCode:5
ausgegeben
der Ton kommt aber immer auf meinem Masterkanal raus den ich in Windows festgelegt habe.
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

schoschy
Beiträge: 56
Registriert: Di 18. Okt 2022, 15:46

Re: MMSystem waveOutOpen

Beitrag von schoschy »

Hey @siro,
so in etwa war auch meine Vorgehensweise, mit dem selben Ergebnis - daher ja die eingehende aussage, ein definiertes Audiodevice anzusprechen.
Infos waren vielleicht etwas knapp vorm langen Wochenende. 8)
Egal welches Device ich ansteuer, es wird nicht vom Windows-SystemDefault abgewichen, wie bei dir auch. Man kann also schonmal feststellen, dass das erwartete? Ergebnis bei uns beiden nicht auftritt.

Vielleicht hat hier noch jemand eine Idee dazu.
Im Forum ist jemand aus der Medienbranche unterwegs, wenn ich das richtig in Erinnerung habe - Da könnten noch Infos reinkommen.

Grüße

Mathias
Beiträge: 6899
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: MMSystem waveOutOpen

Beitrag von Mathias »

Hat jemand Erfahrung hiermit und kann mir auf die Sprünge helfen, habe mit Audio bisher nichts gemacht.
Ich kann die da SDL empfehlen. Wen nur Audio von SDL gebraucht wird, arbeitet dies hervorragend mit der LCL zusammen.
Uns so nebenbei läuft es auf mehreren Plattformen.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

schoschy
Beiträge: 56
Registriert: Di 18. Okt 2022, 15:46

Re: MMSystem waveOutOpen

Beitrag von schoschy »

Hey Mathias,
danke für den Hinweis.

Ich habe mir SDL angesehen und prinzipiell sieht das sehr vielversprechend aus.
Offensichtlich wirkst du bei https://www.freepascal-meets-sdl.net/ mit?
Ich habe davon einmal das SDL_MusicSound example ausprobiert, komme aber zu keinem Ergebnis.
Im ersten Test war ein Error auf eine Adresse, heute geht das gleiche Programm ohne Änderung auf und zu ohne das initialisierte sdlWindow.
Ich kann aber nicht sagen, ob die Verwendung und Einarbeitung in SDL hier von Vorteil ist - wenn ich die zeitliche Komponente mit einbeziehe.

Generell mal noch zur Problematik.
Ich habe einen Windows Rechner, auf welchem "normal" gearbeitet wird - mit Audio usw.
An diesem soll eine weitere Soundkarte angeschlossen werden, an welcher funktionsspezifisch Töne an ein anderes Gerät übergeben werden.
Das kann man sich in etwa wie DTMF bei analogen Telefonen vorstellen.
Mein Ziel hierbei ist, das Wiedergeben eines MemoryStreams an die zweite Soundkarte.
Die frage nach MMSystem war so definiert, da alles soweit mit dem Default-Device funktioniert, nur eben das abspielen auf dem sekundären Device verhält sich nicht so, wie ich es aus der Spec. verstanden hatte.

Ich werde mich vorerst noch etwas mit MMSystem befassen.

Mathias
Beiträge: 6899
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: MMSystem waveOutOpen

Beitrag von Mathias »

Offensichtlich wirkst du bei https://www.freepascal-meets-sdl.net/ mit?
Nein, tue ich nicht, ich beschäftige mich momentan mit dem neusten SDL3.

https://github.com/sechshelme/Lazarus-S ... d_Examples
An diesem soll eine weitere Soundkarte angeschlossen werden, an welcher funktionsspezifisch Töne an ein anderes Gerät übergeben werden.
SDL sollte auch mehrere Geräte unterstützen.
Ich werde mich vorerst noch etwas mit MMSystem befassen.
Windows spezifisches fasse ich nicht an. Ich will möglichst Palattform übergreifendes.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten