Entwickler-Ecke

Windows API - Sound spielt nicht


delporum - Fr 01.07.22 12:45
Titel: Sound spielt nicht

Delphi-Quelltext
1:
Playsound('C:\A.Wav',0,SND_FILENAME);                    

geht, aber nicht

Delphi-Quelltext
1:
sndPlaySound('C:\A.Wav',Snd_Async);                    

aber schon

Delphi-Quelltext
1:
sndPlaySound('C:\A.Wav',Snd_sync);                    

aber ich möchte das mein program weiter läuft und mixen.
und ist das fehlerfrei:

Delphi-Quelltext
1:
2:
SoundPointer^=(Header+)Wave
sndPlaySound(SoundPointer,Snd_Memory Or Snd_Async)


Moderiert von user profile iconTh69: Delphi-Tags hinzugefügt


Sinspin - Fr 01.07.22 14:47

Na? Gibt in der DP wohl keine verwertbaren Antworten?
An den Nutzern liegt das nicht. Sondern daran dass Du nicht mitarbeitest!

Crosspost:
https://www.delphipraxis.net/210905-sound-nicht-immer.html


Th69 - Fr 01.07.22 15:00

Hast du schon den Rückgabewert der Funktion überprüft?


delporum - Sa 02.07.22 15:13

der rückgabewert bei sndPlaySound ist bei Embarcadero 10.4 nur boolean,
und obwohl kein ton gespielt wird ist er true.

Moderiert von user profile iconTh69: Delphi-Tags hinzugefügt


Th69 - Sa 02.07.22 16:00

Ich sehe gerade, hast du schon folgendes probiert:

Delphi-Quelltext
1:
PlaySound('C:\A.Wav'0, SND_FILENAME OR SND_ASYNC);                    
?
Ansonsten, in welchem Projekt (Konsole, Windows) verwendest du es? Und was macht dein Code danach dann?

PS: sndPlaySound [https://docs.microsoft.com/en-us/previous-versions/dd798676(v=vs.85)] gibt es ja nur aus Gründen der Rückwärtskompatibilität (und sollte daher nicht mehr in aktuellen Projekten verwendet werden).


delporum - So 03.07.22 11:53

async bei beiden funktionen ist stumm und liefert true.


Th69 - So 03.07.22 13:06

Mit so wenig Informationen kann man dir nicht weiterhelfen.

Edit: Gerade noch mal gesucht, schau mal ob der Code von Sound abspielen, wie? [https://entwickler-ecke.de/viewtopic.php?p=250531#250531] (also HInstance [https://docwiki.embarcadero.com/Libraries/Sydney/de/SysInit.HInstance] verwenden) funktioniert?!


delporum - Mo 04.07.22 12:25

da ich ja nur 1 zeile habe, bei den anderen fällen, und nur bei änderung sync in async nicht spielt, weiss ich nicht welches hinstance?

Moderiert von user profile iconTh69: Delphi-Tags hinzugefügt


Th69 - Mo 04.07.22 14:01

Ich habe dir extra den Link dazu gegeben, es ist eine globale Variable, die du einfach verwenden kannst (zumindestens in Windows VCL-Projekten).


delporum - Di 05.07.22 06:37


Delphi-Quelltext
1:
Playsound('D:\A.Wav',hinstance,SND_FILENAME or snd_async);                    
geht auch nicht.

Moderiert von user profile iconTh69: Delphi-Tags hinzugefügt


jaenicke - Di 05.07.22 09:55

Diese uralten Funktionen wie PlaySound unterstützen kein paralleles Abspielen mehrerer Sounds. Du kannst nur einen Sound asynchron starten, aber keinen weiteren parallel dazu abspielen.

Dafür kannst du z.B. die bass.dll verwenden:
https://www.un4seen.com/
Diese ist sehr umfangreich, aber für deinen Zweck brauchst du davon nicht viel. Beispiele sind dabei.

Hauptsächlich benötigst du die Funktionen BASS_StreamCreateFile zum Zugriff auf die Datei und BASS_ChannelPlay zum Abspielen.

Natürlich brauchst du etwas Zeit, um dich darin einzuarbeiten. Aber so simpel wie du es dir vorstellst, ist das ganze nicht. Die Zeit solltest du investieren, damit du auch ein gutes Ergebnis bekommst. Hier gibt es auch ein Tutorial zu dem Thema, aber das ist sehr viel umfangreicher als das, was du brauchst. Insofern könnte es dich auch verwirren. Aber immerhin siehst du dort Beispiele für die Verwendung der genannten Funktionen:
https://www.delphi-treff.de/tutorials/sonstiges/mein-einfacher-mp3-player/


Th69 - Di 05.07.22 10:51

So wie ich die Doku verstehe, sollte es mit SND_NOSTOP gehen, mehrere Sounds im selben Prozess zu verwenden (ausprobiert habe ich das aber noch nicht).


jaenicke - Di 05.07.22 12:23

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
So wie ich die Doku verstehe, sollte es mit SND_NOSTOP gehen, mehrere Sounds im selben Prozess zu verwenden (ausprobiert habe ich das aber noch nicht).
Nein, das sorgt nur dafür, dass ein bestehender Sound nicht gestoppt wird. Der neue wird dann aber nicht abgespielt. Paralleles Abspielen ist mit dieser API nicht möglich.


Th69 - Di 05.07.22 12:38

OK, also nur maximal 1 asynchroner Sound. Dann ist die "BASS audio library" wirklich die beste Wahl dafür.


delporum - Di 05.07.22 18:19

was könnt ihr dazu sagen, dass bass.dll nicht 64-Bit ist?


jaenicke - Di 05.07.22 18:26

user profile icondelporum hat folgendes geschrieben Zum zitierten Posting springen:
was könnt ihr dazu sagen, dass bass.dll nicht 64-Bit ist?
Wie kommst du darauf?
Es stimmt nämlich nicht, wie ein Blick auf die verlinkte Webseite ("64-bit support - Both 32-bit and 64-bit architectures are supported") oder in den Download (zweite bass.dll im Unterordner x64) zeigen würde.

Davon abgesehen ist 64-Bit für eigene Anwendungen fast immer gar nicht wirklich nötig.