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 Objekt | n_pbt_soundplayer |
| Wofür | Ein Klang vor einer Meldung, ein Alarm, eine Wartemusik, eine vom Benutzer gewählte mp3, ein Stream aus dem Internet |
| Prinzip | Eine 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ängigkeit | Die 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 #
- Eine Datei des Arbeitsplatzes ist jeder Pfad, den PowerBuilder benennen kann — absolut, relativ zum Anwendungsordner, im Netzwerk. Die DLL liefert sie dem Player als Stream, in Abschnitten, mit den Bereichsanfragen, die ein Player zum Springen im Stück stellt: nichts wird in den Speicher geladen, und
of_seekist sofort. - Eine
https-URL wird unverändert übergeben: Der Ton startet, sobald sein Anfang da ist. Einehttp://-Adresse wird abgelehnt (ue_failed,REASON_INSECURE): Die Seite des Players wird über https ausgeliefert, und die Engine würde die Adresse auf https heben oder blockieren — ein Intranet-Server ohne TLS erschiene als nicht vorhanden. Laden Sie sie zuerst herunter (restclient.of_downloadin eine temporäre Datei). Ein Medium unterliegt nicht CORS, anders als ein API-Aufruf — sieherestclientfür diesen Fall. - Ein Piepton (
of_beep,of_beep_sync) braucht keine Datei: ein Oszillator der Audio-Engine, mit der Frequenz und Dauer, die Sie angeben.
Eigenschaften #
| Eigenschaft | Typ | Standard | Rolle |
|---|---|---|---|
ii_volume | integer | 100 | Lautstä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_loop | boolean | false | Wahr, 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_error | string | "" | 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_ms | long | 300000 | Die 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_rate | integer | 100 | Geschwindigkeit 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_pan | integer | 0 | Balance 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_ms | long | 0 | Blende in Millisekunden: jeder Start steigt aus der Stille, jeder Stopp oder jede Pause klingt aus |
ipo_owner | powerobject | null | Das 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 #
| Methode | Rolle |
|---|---|
of_open ( ) → long | Erzeugt 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 ( ) → boolean | Wahr, sobald der Player existiert |
of_play (string as_source {, long al_start_ms}) → long | Spielt 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) → long | Spielt 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) → long | Ein 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) → long | Derselbe 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 ( ) → long | Hä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 ( ) → long | Setzt 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) → long | Springt 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 ( ) → boolean | Wahr, 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 ( ) → boolean | Wahr, solange der Ton durch of_pause angehalten ist |
of_duration ( ) → long | Die Länge des Tons in Millisekunden, 0 solange unbekannt; ue_started trägt sie ebenfalls |
of_position ( ) → long | Wo der Ton steht, in Millisekunden — von einem Timer abfragen, um eine eigene Fortschrittsleiste zu bewegen |
of_source ( ) → string | Was of_play zuletzt erhielt, unverändert |
of_play_over (string as_source) → long | Spielt 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) → long | Stellt 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 ( ) → long | Vergisst 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 ( ) → long | Gibt die Zahl der noch wartenden Töne zurück |
of_preload (string as_source) → long | Lä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) → long | Bringt 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) → long | Ein 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) → long | Derselbe 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 ( ) → boolean | Wahr, 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[]}) → long | 5-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) → long | Setzt 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[]) → long | Fü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}) → long | Schaltet 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 ( ) → long | Gibt 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[]) → long | Fü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 #
| Ereignis | Wann |
|---|---|
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 #
- Der Hauptkanal und die Überlagerung.
of_play,of_pause,of_seek,of_stopsteuern EINEN Ton: ein Musikstück, ein Klingeln.of_play_overspielt einen zweiten darüber, ohne etwas zu unterbrechen — ein Alarm über einem Hintergrund.ue_endednennt jeden über seine Quelle. Jedes Verb stellt SEINEN Ton ein: mitof_play_overübergebeneii_volumeundii_rategelten für die Überlagerung, nicht für den Hintergrund — ein Alarm mit 100 über einem vonof_fade_toauf 20 gesenkten Hintergrund, der Hintergrund bleibt bei 20. Pieptöne und benannte Töne sind eigene Kanäle:of_playbricht sie nicht ab, nurof_stopbricht alles ab. - Die Warteschlange.
of_enqueuewartet auf das Ende des laufenden Tons;ue_queue_donesagt, wann der letzte vorbei ist. Ein Ton, der fehlschlägt (ue_failed), bringt die folgenden nicht zum Schweigen.of_playbleibt das Verb, das unterbricht. - Die Blenden.
il_fade_mslässt jeden Start aus der Stille steigen und jeden Stopp ausklingen;of_fade_tosenkt den Hintergrund während einer Ansage. Nichts Abruptes. - Die benannten Töne.
of_play_named(SOUND_SUCCESS)und seine vier Geschwister werden synthetisiert: nichts auszuliefern, nichts auf der Platte zu suchen. - Vor dem Alarm.
of_preloadöffnet die Datei im Voraus,of_has_outputsagt, ob der Arbeitsplatz überhaupt eine Ausgabe hat. Der Ton geht an die Standardausgabe von Windows: Die Engine gibt die Id einer Ausgabe nur einer Seite mit Medienzugriff, den ein gewöhnlicher Arbeitsplatz nicht gewährt — eine Ausgabe zu wählen wird daher nicht angeboten. - Die Balance (
ii_pan) gilt für Dateien des Arbeitsplatzes. Eine URL spielt ohne Balance: der Browser weigert sich, einen Ton einer anderen Site in seinen Audiographen zu speisen (CORS), und das ist keine Einstellung. - Keine Aufnahme. Das Mikrofon aufzunehmen ist eine andere Komponente; diese spielt.
// 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 #
- Ein Objekt pro Fenster, mit ihm geöffnet (
of_open): Der verborgene Player kostet beim ersten Mal einige hundert Millisekunden, danach nichts. of_play_syncblockiert Ihr Skript, und nach 250 ms die Maus: Das Fenster zeichnet sich neu, aber alle PBToolboxAI-Komponenten der Anwendung zeigen die Sanduhr und ignorieren Klicks bis zur Rückkehr; und die Ereignisse der Komponente wie die Timer Ihrer Fenster treffen während des Wartens weiter ein — ein aus einem von ihnen angeforderter synchroner Ton wird abgelehnt (-4). Für kurze Töne — ein Klang, eine Aufforderung — undof_playfür Musik.- Eine fehlende Datei ist keine Ausnahme:
of_play_syncgibt-4zurück,of_playlöstue_failedaus, undis_last_errornennt die Datei.