PBToolboxAI v4 ← Site

soundplayer — n_pbt_soundplayer #

← Komponentenreferenz · Inhalt des Handbuchs

Spielt einen Ton oder ein Musikstück — eine Datei des Arbeitsplatzes oder eine URL — asynchron (Ereignisse) oder synchron (der Aufruf kehrt zurück, wenn der Ton zu Ende ist), und einen reinen Piepton ohne Datei. Jedes Format, das die WebView2-Engine dekodiert: mp3, wav, ogg, opus, flac, aac, m4a, mp4, webm. Keine Dritt-DLL, kein auf wav beschränktes PlaySound.

▶ Live ansehen — Demoanwendung, Kachel Sound player: die Töne, der Code, der sie spielt, und diese Seite nebeneinander.


Kurzüberblick #

Nichtvisuelles Objektn_pbt_soundplayer
WofürEin Klang vor einer Meldung, ein Alarm, eine Wartemusik, eine vom Benutzer gewählte mp3, ein Stream aus dem Internet
PrinzipEine verborgene Seite trägt einen Player; of_play kehrt sofort zurück und die Ereignisse erzählen den Rest, of_play_sync wartet auf das Ende des Tons
AbhängigkeitDie WebView2-Runtime, die die Bibliothek ohnehin braucht — sonst nichts

Schnellstart #

// In the window : the object
n_pbt_soundplayer inv_sound
inv_sound = create n_pbt_soundplayer

// Synchronous : the next line runs after the chime
inv_sound.of_play_sync(/*source*/ "C:\Windows\Media\chimes.wav")
MessageBox("Orders", "Order 4152 shipped.")

// Asynchronous : a music from the Internet, the window stays alive. The ue_started /
// ue_ended events arrive on their own - nothing else to wire.
inv_sound.ii_volume = 60
inv_sound.of_play(/*source*/ "https://example.org/music/lobby.mp3")

Die ue_*-Ereignisse werden von selbst geliefert — die Komponente holt sie selbst, solange der Player offen ist, und löst sie an der Komponente aus: nichts zu verdrahten, kein Empfänger und kein Timer.


Datei oder URL, und warum ein langes Stück sofort startet #


Eigenschaften #

EigenschaftTypStandardRolle
ii_volumeinteger100Lautstärke in Prozent, 0 bis 100, übergeben mit dem Verb, das einen Ton startet — und es ist die Lautstärke DIESES Tons: of_play, of_play_sync und of_crossfade stellen den Hauptton ein; of_play_over, of_beep und of_play_named spielen ihren eigenen damit, ohne den Hauptton zu berühren (ein Alarm mit 100 über einem auf 20 gesenkten Hintergrund); ein von of_enqueue eingereihter Ton behält sie für seine Runde. Während ein Ton spielt geändert, wartet sie auf das nächste Verb — nur of_fade_to ändert den laufenden Ton
ib_loopbooleanfalseWahr, um den Ton bis of_stop in Schleife zu spielen — ein Klingeln, eine Hintergrundmusik. Wird mit dem nächsten Ton übergeben. of_play_sync ignoriert es: ein synchroner Ton spielt einmal, eine Schleife hat kein Ende, auf das man warten könnte
is_last_errorstring""Warum der letzte Aufruf fehlschlug: fehlende Datei, nicht dekodierbares Format, http://-Adresse, stumme URL, keine Audioausgabe. Auch von ue_failed gefüllt. Nach einem of_play_sync, das 0 lieferte: "stopped", wenn der Ton abgebrochen statt zu Ende gespielt wurde
il_timeout_mslong300000Die maximale Dauer eines synchronen Tons (of_play_sync, of_beep_sync, of_play_named_sync); standardmäßig fünf Minuten. Danach liefert der Aufruf -4 und der Ton wird abgebrochen (ue_stopped folgt). 0 oder weniger: ohne Grenze
ii_rateinteger100Geschwindigkeit in Prozent (25 bis 400), übergeben mit dem Verb, das einen Ton startet, für DIESEN Ton: den Hauptton oder eine Überlagerung (of_play_over), ohne den Hauptton zu ändern
ii_paninteger0Balance des HAUPTtons, von -100 (links) bis 100 (rechts), übergeben mit of_play, of_play_sync oder of_crossfade, für DATEIEN; eine URL spielt ohne Balance
il_fade_mslong0Blende in Millisekunden: jeder Start steigt aus der Stille, jeder Stopp oder jede Pause klingt aus
ipo_ownerpowerobjectnullDas visuelle Objekt, für das dieser Player arbeitet: die Lizenz wird an seiner Klasse geprüft. Nur in der Demoanwendung nötig; ein Entwicklungs- oder Laufzeitschlüssel schaltet den Player ohne es frei. Nicht freigeschaltet läuft der Player im Demomodus — nur die ersten 10 Sekunden eines Tons werden gespielt

Methoden #

MethodeRolle
of_open ( ) → longErzeugt den Player. Optional — jede Methode tut es — aber beim Öffnen des Fensters aufgerufen, fällt der Aufwand einmal an. Liefert das Handle (> 0) oder -2, wenn der Player nicht erzeugt werden konnte (is_last_error nennt den Grund)
of_is_open ( ) → booleanWahr, sobald der Player existiert
of_play (string as_source {, long al_start_ms}) → longSpielt ohne zu warten: eine Datei des Arbeitsplatzes oder eine https-URL (eine http://-Adresse wird abgelehnt, REASON_INSECURE), das Ende kommt über ue_ended. al_start_ms lässt den Ton an dieser Stelle beginnen (im Demomodus nie über die ersten 10 Sekunden hinaus). Der laufende Hauptton wird ersetzt; ein Piepton oder ein benannter Ton läuft weiter. Liefert 0, sobald gestartet, -2, wenn der Player nicht erzeugt werden konnte, -4, wenn die Seite nicht antwortete
of_play_sync (string as_source) → longSpielt und wartet auf das Ende: Der Aufruf kehrt zurück, wenn der Ton zu Ende (oder gestoppt) ist. Das Fenster zeichnet sich weiter neu, aber nach 250 ms zeigen alle PBToolboxAI-Komponenten der Anwendung die Sanduhr und ignorieren die Maus bis zur Rückkehr: nur für kurze Töne. Spielt einmal, was auch immer ib_loop sagt. Liefert 0, sobald der Ton zu Ende ist (is_last_error = "stopped", wenn er abgebrochen wurde), -2, wenn der Player nicht erzeugt werden konnte, -4, wenn er nicht spielen konnte, il_timeout_ms abgelaufen ist (der Ton wird abgebrochen) oder schon ein anderer synchroner Ton wartet
of_beep (long al_hz, long al_ms) → longEin reiner Ton ohne Datei: al_hz (20 bis 20 000) für al_ms Millisekunden (10 bis 5 000), mit ii_volume. Ein eigener Kanal: of_play bricht ihn nicht ab, of_stop schon. Kehrt sofort zurück; ue_ended folgt. Liefert 0, sobald gestartet, -2, wenn der Player nicht erzeugt werden konnte
of_beep_sync (long al_hz, long al_ms) → longDerselbe Ton, und der Aufruf kehrt zurück, wenn er zu Ende ist: zwei hintereinander ergeben ein Zweiton-Signal. Liefert 0, -2, wenn der Player nicht erzeugt werden konnte, oder -4 ohne Audioausgabe oder wenn schon ein anderer synchroner Ton wartet (is_last_error)
of_stop ( )Stoppt alles, was der Player spielt — den Ton, einen Piepton, einen benannten Ton, die Überlagerungen, eine Überblendung — und leert die Warteschlange; ein ue_stopped folgt
of_pause ( ) → longHält den Ton an der aktuellen Stelle an; of_resume setzt ihn fort. Liefert 0, sobald erledigt, -2, wenn der Player nicht erzeugt werden konnte
of_resume ( ) → longSetzt den Ton dort fort, wo of_pause ihn ließ. Liefert 0, sobald erledigt, -2, wenn der Player nicht erzeugt werden konnte
of_seek (long al_ms) → longSpringt an eine Stelle des Tons, in Millisekunden ab seinem Anfang. Im Demomodus nie über die ersten 10 Sekunden hinaus. Um an einer Stelle zu BEGINNEN, nimmt of_play eine an. Liefert 0, sobald erledigt, -5, wenn kein Ton spielt (nichts zu verschieben), -2, wenn der Player nicht erzeugt werden konnte, -4, wenn die Seite nicht antwortete
of_is_playing ( ) → booleanWahr, solange ein Ton, ein Piepton, ein benannter Ton oder eine Überlagerung läuft — ein pausierter Ton zählt, er ist nicht zu Ende
of_is_paused ( ) → booleanWahr, solange der Ton durch of_pause angehalten ist
of_duration ( ) → longDie Länge des Tons in Millisekunden, 0 solange unbekannt; ue_started trägt sie ebenfalls
of_position ( ) → longWo der Ton steht, in Millisekunden — von einem Timer abfragen, um eine eigene Fortschrittsleiste zu bewegen
of_source ( ) → stringWas of_play zuletzt erhielt, unverändert
of_play_over (string as_source) → longSpielt einen Ton ÜBER das Laufende, ohne es zu unterbrechen, mit ii_volume und ii_rate — seinen eigenen: der Hintergrund behält seine (ein von of_fade_to gesenkter Hintergrund bleibt unter einem Alarm mit 100 leise); ue_ended nennt ihn über seine Quelle, of_stop stoppt ihn mit dem Rest. Liefert 0, sobald erledigt, -2, wenn der Player nicht erzeugt werden konnte
of_enqueue (string as_source) → longStellt einen Ton in die WARTESCHLANGE: sofort gespielt, wenn der Player frei ist, sonst nach dem laufenden Ton (oder Piepton, oder benannten Ton), nie abgebrochen. Der eingereihte Ton behält ii_volume, ii_rate und ib_loop, wie sie beim Aufruf sind, für seine Runde. Ein Ton, der nicht spielen kann, löst ue_failed aus, und die Warteschlange läuft weiter. Liefert 0, sobald erledigt, -2, wenn der Player nicht erzeugt werden konnte
of_clear_queue ( ) → longVergisst die wartenden Töne, ohne den laufenden abzubrechen; ue_queue_done folgt trotzdem seinem Ende, er ist der letzte Ton der Warteschlange. Liefert 0, sobald erledigt, -2, wenn der Player nicht erzeugt werden konnte
of_queue_count ( ) → longGibt die Zahl der noch wartenden Töne zurück
of_preload (string as_source) → longLädt einen Ton, ohne ihn zu spielen: Das erste of_play dieser Quelle startet sofort. Eine unlesbare Quelle wird von diesem of_play über ue_failed gemeldet. Liefert 0, sobald erledigt, -2, wenn der Player nicht erzeugt werden konnte
of_fade_to (integer ai_volume, long al_ms) → longBringt die Lautstärke in al_ms ms auf ai_volume (0 bis 100), beim laufenden Ton; das Ziel wird ii_volume, und ein währenddessen darüber gespielter Ton unterbricht die Blende nicht. Liefert 0, sobald erledigt, -2, wenn der Player nicht erzeugt werden konnte
of_play_named (string as_name) → longEin SYNTHETISIERTER Ton, ohne Datei, mit ii_volume: SOUND_SUCCESS, SOUND_ERROR, SOUND_WARNING, SOUND_INFO, SOUND_NOTIFY. Ein eigener Kanal: of_play bricht ihn nicht ab, of_stop schon. Liefert 0, sobald gestartet, -2, wenn der Player nicht erzeugt werden konnte; ein unbekannter Name kommt über ue_failed (REASON_UNKNOWN)
of_play_named_sync (string as_name) → longDerselbe Ton, und der Aufruf kehrt an seinem Ende zurück. Liefert 0, -2, wenn der Player nicht erzeugt werden konnte, -4 bei unbekanntem Namen, ohne Audioausgabe oder wenn schon ein anderer synchroner Ton wartet (is_last_error)
of_has_output ( ) → booleanWahr, wenn der Arbeitsplatz überhaupt eine Audioausgabe hat: VOR einem Alarm zu fragen. Der Ton geht immer an die Standardausgabe von Windows
of_equalizer (boolean ab_on {, integer ai_gains[]}) → long5-Band-Equalizer (60 / 230 / 910 / 3600 / 14000 Hz, of_eq_frequencies liefert die Mitten), Verstärkung in dB von -24 bis 24 (ein Wert außerhalb wird auf die nächste Grenze gesetzt); die Überladung setzt alle Verstärkungen, of_equalizer_band eine live. LOKALE Dateien. Liefert 0, sobald erledigt, -2, wenn der Player nicht erzeugt werden konnte
of_equalizer_band (integer ai_band, integer ai_gain) → longSetzt die Verstärkung EINES Bandes (ai_band 1 bis 5, ai_gain in dB, -24 bis 24) und wendet sie sofort auf den laufenden Ton an — ein Schieberegler von Ihnen, live bewegt; die anderen Bänder behalten ihre Verstärkung. Liefert 0, -5, wenn das Band außerhalb liegt, -2, wenn der Player nicht erzeugt werden konnte
of_eq_frequencies (ref long al_freqs[]) → longFüllt al_freqs mit der Mittenfrequenz jedes Bands, in Hz und der Reihe nach (60, 230, 910, 3600, 14000) — was eine eigene Bandbeschriftung zeigt. Gibt die Zahl der Bänder zurück, 5
of_meter (boolean ab_on {, integer ai_bars}) → longSchaltet einen VU-Meter / Analysator ein: Fragen Sie dann of_level (0 bis 100) und of_spectrum (ai_bars Balken) per Timer ab, um Ihren eigenen Visualisierer zu zeichnen. LOKALE Dateien. Liefert 0, sobald erledigt, -2, wenn der Player nicht erzeugt werden konnte
of_level ( ) → longGibt die aktuelle Lautstärke zurück, 0 bis 100, live gelesen — die Nadel eines VU-Meters; 0 wenn der Meter (of_meter) aus ist oder nichts spielt. Per Timer abfragen
of_spectrum (ref long al_bars[]) → longFüllt al_bars mit dem Spektrum, live gelesen: so viele Werte wie of_meter verlangt hat, je 0 bis 100, tiefe Frequenzen zuerst — die Balken eines eigenen Analysers. Gibt die Zahl der Balken zurück, 0 bei ausgeschaltetem Meter
of_crossfade (string as_source, long al_ms) → longÜberblendung: der laufende Ton klingt über al_ms aus, während die neue Quelle ansteigt — ein Titelwechsel ohne Lücke; 0 schaltet sofort um. Der neue Ton nimmt ii_volume, ii_rate, ii_pan und ib_loop, und ein of_fade_to während des Anstiegs übernimmt. of_stop während der Blende stoppt beide, und ein of_play_sync, das auf den ersten Ton wartete, kehrt zurück. Liefert 0, sobald gestartet, -2, wenn der Player nicht erzeugt werden konnte; eine leere Quelle kommt über ue_failed
of_process_events ( )Leert die Ereigniswarteschlange und löst sie am Objekt aus. Der interne Pump der Komponente ruft sie für Sie auf, solange der Player offen ist — Sie rufen sie nie auf
of_close ( )Gibt den Player frei und stoppt zuerst den Ton: ein laufender Ton endet mit seinem ue_stopped, ausgelöst vor der Rückkehr; wird bei der Zerstörung des Objekts für Sie erledigt
of_reset ( )Stoppt den Ton und setzt jede Einstellung auf den Standard zurück

Ereignisse #

EreignisWann
ue_started (string as_source, long al_duration_ms)Der Ton startet wirklich — eine URL, sobald genug Daten da sind. al_duration_ms ist die Länge, wenn die Datei sie nennt, sonst 0
ue_ended (string as_source, boolean ab_truncated)Der Ton ist von selbst zu Ende. ab_truncated ist wahr, wenn die Demo-Grenze ihn abschnitt, nie mit Lizenz. Ein Schleifenton endet nicht: er wird gestoppt
ue_failed (string as_source, string as_message, string as_reason)Der Ton konnte nicht spielen. as_reason ist ein Wort zum Prüfen, eine REASON_*-Konstante: REASON_INSECURE (http://-Adresse), REASON_FORMAT (Format über seinen Namen abgelehnt), REASON_UNSUPPORTED (fehlende Datei, fehlerhafte file://-Adresse), REASON_NETWORK, REASON_DECODE, REASON_NO_SOURCE, REASON_UNKNOWN (kein solcher benannter Ton), REASON_UNAVAILABLE (keine Audioausgabe), REASON_FAILED; as_message ist der anzuzeigende Satz. Ein fehlschlagender Ton der Warteschlange hält die Warteschlange nicht an
ue_stopped ( )Einmal ausgelöst, wenn of_stop (oder of_close, oder das Ende von il_timeout_ms) abbrach, was spielte — nicht, wenn ein Ton von selbst endet, das ist ue_ended
ue_paused ( ) / ue_resumed ( )Der Ton wird angehalten, dann fortgesetzt
ue_progress (long al_position_ms, long al_duration_ms)Einmal pro Echtzeit-Sekunde während der Wiedergabe, unabhängig von ii_rate: Position und Dauer
ue_queue_done ( )Der letzte Ton der Warteschlange (of_enqueue) ist zu Ende

Mehrere Töne, Blenden, Warteschlange #

// A background in a loop, faded in ; an alert over it, the background lowered meanwhile
inv_sound.il_fade_ms = 1500
inv_sound.ib_loop = true
inv_sound.of_play(/*source*/ "C:\Windows\Media\Ring05.wav")
inv_sound.of_fade_to(/*volume*/ 20, /*ms*/ 500)

// The alert has its own volume : the background stays at 20
inv_sound.ii_volume = 100
inv_sound.of_play_over(/*source*/ "C:\Windows\Media\Alarm01.wav")

// Announcements in a row : each one waits for the previous
inv_sound.of_enqueue(/*source*/ "order-4152.mp3")
inv_sound.of_enqueue(/*source*/ "order-4153.mp3")

// A confirmation with no file at all
inv_sound.of_play_named(/*name*/ n_pbt_soundplayer.SOUND_SUCCESS)

Beispiele #

Ein Zweiton-Signal, ohne Datei #

// Each call waits for its tone : the second starts when the first is over
inv_sound.of_beep_sync(/*hz*/ 660, /*ms*/ 180)
inv_sound.of_beep_sync(/*hz*/ 990, /*ms*/ 220)

Eine vom Benutzer gewählte mp3, mit Fortschrittsleiste #

// Local variables
string ls_path, ls_file

// Let the user pick a music file, then play it
if GetFileOpenName("Music", ls_path, ls_file, "mp3", "Music (*.mp3;*.wav;*.flac),*.mp3;*.wav;*.flac") = 1 then
	inv_sound.of_play(/*source*/ ls_path)          // returns at once ; ue_started brings the length
	Timer(0.5)                         // in the window's timer event :
end if

// event timer of the window
if inv_sound.of_is_playing() then
	hpb_progress.Position = inv_sound.of_position() * 100 / Max(inv_sound.of_duration(), 1)
end if

Ein Klingeln in Schleife, bis der Benutzer handelt #

// A ring at 40 %, in a loop until it is stopped
inv_sound.ii_volume = 40
inv_sound.ib_loop = true
inv_sound.of_play(/*source*/ "C:\Windows\Media\Ring01.wav")

// ... later, in the button that acknowledges the call :
inv_sound.of_stop()

Bewährte Praxis #

← Komponentenreferenz · Inhalt des Handbuchs