soundplayer — n_pbt_soundplayer #
← Riferimento dei componenti · Sommario della guida
Riproduce un suono o un brano — un file della postazione o un URL — in modo asincrono (eventi) o sincrono (la chiamata ritorna quando il suono è finito), e un bip puro senza alcun file. Tutti i formati che il motore WebView2 decodifica: mp3, wav, ogg, opus, flac, aac, m4a, mp4, webm. Nessuna DLL di terzi, nessun
PlaySoundlimitato al wav.
▶ Vederlo dal vivo — Applicazione dimostrativa, riquadro Sound player: i suoni, il codice che li riproduce e questa pagina, fianco a fianco.
In breve #
| Oggetto non visuale | n_pbt_soundplayer |
| Serve a | Un carillon prima di un messaggio, un avviso, una musica d'attesa, un mp3 scelto dall'utente, un flusso da Internet |
| Principio | Una pagina nascosta porta un lettore; of_play ritorna subito e gli eventi raccontano il resto, of_play_sync attende la fine del suono |
| Dipendenza | Il runtime WebView2, già richiesto dalla libreria — nient'altro |
Avvio rapido #
// 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")
Gli eventi ue_* arrivano da soli — il componente li preleva da solo finché il lettore è aperto e li solleva sul componente: niente da collegare, né ricevitore né timer.
File o URL, e perché un brano lungo parte subito #
- Un file della postazione è qualsiasi percorso che PowerBuilder sa nominare — assoluto, relativo alla cartella dell'applicazione, di rete. La DLL lo serve al lettore in flusso, a fette, con le richieste di intervallo che un lettore emette per spostarsi nel brano: nulla è caricato in memoria, e
of_seekè immediato. - Un URL
httpsè passato così com'è: il suono parte appena il suo inizio è arrivato. Un indirizzohttp://è rifiutato (ue_failed,REASON_INSECURE): la pagina del lettore è servita in https, e il motore alzerebbe l'indirizzo a https o lo bloccherebbe — un server intranet senza TLS sembrerebbe introvabile. Scaricalo prima (restclient.of_downloadverso un file temporaneo). Un media non è soggetto al CORS, a differenza di una chiamata API — vedirestclientper quel caso. - Un bip (
of_beep,of_beep_sync) non ha bisogno di alcun file: un oscillatore del motore audio, alla frequenza e per la durata che indichi.
Proprietà #
| Proprietà | Tipo | Predefinito | Ruolo |
|---|---|---|---|
ii_volume | integer | 100 | Volume in percentuale, da 0 a 100, consegnato con il verbo che avvia un suono — ed è il volume di QUEL suono: of_play, of_play_sync e of_crossfade regolano il suono principale; of_play_over, of_beep e of_play_named suonano il proprio a quel volume senza toccare il suono principale (un allarme a 100 su uno sfondo abbassato a 20); un suono messo in coda da of_enqueue lo conserva per il suo turno. Cambiato mentre un suono suona, attende il verbo successivo — solo of_fade_to cambia il suono in corso |
ib_loop | boolean | false | Vero per ripetere il suono in ciclo fino a of_stop — una suoneria, una musica di sottofondo. Consegnato con il suono successivo. of_play_sync lo ignora: un suono sincrono suona una volta, un ciclo non ha una fine da attendere |
is_last_error | string | "" | Perché l'ultima chiamata è fallita: file mancante, formato non decodificabile, indirizzo http://, URL muto, nessuna uscita audio. Riempito anche da ue_failed. Dopo un of_play_sync che ha reso 0: "stopped" se il suono è stato interrotto invece che suonato fino alla fine |
il_timeout_ms | long | 300000 | La durata massima di un suono sincrono (of_play_sync, of_beep_sync, of_play_named_sync); cinque minuti per impostazione predefinita. Oltre, la chiamata rende -4 e il suono viene interrotto (segue ue_stopped). 0 o meno: senza limite |
ii_rate | integer | 100 | Velocità in percentuale (da 25 a 400), consegnata con il verbo che avvia un suono, per QUEL suono: il suono principale, o una sovrapposizione (of_play_over) senza cambiare il principale |
ii_pan | integer | 0 | Bilanciamento del suono PRINCIPALE, da -100 (sinistra) a 100 (destra), consegnato con of_play, of_play_sync o of_crossfade, per i FILE; un URL suona senza bilanciamento |
il_fade_ms | long | 0 | Dissolvenza in millisecondi: ogni avvio sale dal silenzio, ogni stop o pausa si spegne |
ipo_owner | powerobject | null | L'oggetto visuale per cui lavora questo lettore: la licenza si verifica sulla sua classe. Necessario solo nell'applicazione dimostrativa; una chiave di sviluppo o di runtime sblocca il lettore senza di esso. Non sbloccato, il lettore è in modalità demo — solo i primi 10 secondi di un suono sono riprodotti |
Metodi #
| Metodo | Ruolo |
|---|---|
of_open ( ) → long | Crea il lettore. Facoltativo — ogni metodo lo fa — ma chiamarlo all'apertura della finestra paga il costo una volta. Rende l'handle (> 0), o -2 se il lettore non ha potuto essere creato (is_last_error dice perché) |
of_is_open ( ) → boolean | Vero appena il lettore esiste |
of_play (string as_source {, long al_start_ms}) → long | Suona senza attendere: un file della postazione o un URL https (un indirizzo http:// è rifiutato, REASON_INSECURE), la fine arriva da ue_ended. al_start_ms fa partire il suono da quel punto (in modalità demo, mai oltre i primi 10 secondi). Il suono principale in corso è sostituito; un bip o un suono con nome continua. Rende 0 una volta avviato, -2 se il lettore non ha potuto essere creato, -4 se la pagina non ha risposto |
of_play_sync (string as_source) → long | Suona e attende la fine: la chiamata ritorna quando il suono è finito (o fermato). La finestra continua a ridisegnarsi, ma oltre 250 ms tutti i componenti PBToolboxAI dell'applicazione mostrano la clessidra e ignorano il mouse fino al ritorno: riservalo ai suoni brevi. Suona una volta, qualunque cosa dica ib_loop. Rende 0 una volta finito il suono (is_last_error = "stopped" se è stato interrotto), -2 se il lettore non ha potuto essere creato, -4 se non ha potuto suonare, se il_timeout_ms è scaduto (il suono viene interrotto) o se un altro suono sincrono attende già |
of_beep (long al_hz, long al_ms) → long | Un suono puro senza file: al_hz (da 20 a 20 000) per al_ms millisecondi (da 10 a 5 000), al volume ii_volume. Un canale a sé: of_play non lo interrompe, of_stop sì. Ritorna subito; segue ue_ended. Rende 0 una volta avviato, -2 se il lettore non ha potuto essere creato |
of_beep_sync (long al_hz, long al_ms) → long | Lo stesso suono, e la chiamata ritorna quando è finito: due di seguito fanno un segnale a due note. Rende 0, -2 se il lettore non ha potuto essere creato, o -4 senza uscita audio o se un altro suono sincrono attende già (is_last_error) |
of_stop ( ) | Ferma tutto ciò che il lettore suona — il suono, un bip, un suono con nome, le sovrapposizioni, una dissolvenza incrociata — e svuota la coda; segue un ue_stopped |
of_pause ( ) → long | Sospende il suono dov'è; of_resume lo riprende. Rende 0 una volta fatto, -2 se il lettore non ha potuto essere creato |
of_resume ( ) → long | Riprende il suono dove of_pause l'ha lasciato. Rende 0 una volta fatto, -2 se il lettore non ha potuto essere creato |
of_seek (long al_ms) → long | Si posiziona in un punto del suono, in millisecondi dal suo inizio. In modalità demo, mai oltre i primi 10 secondi. Per PARTIRE da una posizione, of_play ne accetta una. Rende 0 una volta fatto, -5 se nessun suono è in corso (nulla da spostare), -2 se il lettore non ha potuto essere creato, -4 se la pagina non ha risposto |
of_is_playing ( ) → boolean | Vero finché un suono, un bip, un suono con nome o una sovrapposizione è in corso — un suono in pausa conta, non è finito |
of_is_paused ( ) → boolean | Vero finché il suono è sospeso da of_pause |
of_duration ( ) → long | La lunghezza del suono in millisecondi, 0 finché sconosciuta; anche ue_started la porta |
of_position ( ) → long | Dov'è il suono, in millisecondi — da leggere da un timer per far avanzare una tua barra di avanzamento |
of_source ( ) → string | Ciò che of_play ha ricevuto per ultimo, tale e quale |
of_play_over (string as_source) → long | Suona un suono SOPRA ciò che suona, senza interromperlo, a ii_volume e ii_rate — i suoi: lo sfondo conserva i propri (uno sfondo abbassato da of_fade_to resta basso sotto un allarme a 100); ue_ended lo nomina dalla sua sorgente, of_stop lo ferma con il resto. Rende 0 una volta fatto, -2 se il lettore non ha potuto essere creato |
of_enqueue (string as_source) → long | Mette un suono in CODA: suonato subito se il lettore è libero, dopo il suono (o il bip, o il suono con nome) in corso altrimenti, mai interrotto. Il suono in coda conserva ii_volume, ii_rate e ib_loop come sono al momento della chiamata, per il suo turno. Un suono che non può suonare solleva ue_failed e la coda continua. Rende 0 una volta fatto, -2 se il lettore non ha potuto essere creato |
of_clear_queue ( ) → long | Dimentica i suoni in attesa, senza interrompere quello che suona; ue_queue_done segue comunque la sua fine, è l'ultimo suono della coda. Rende 0 una volta fatto, -2 se il lettore non ha potuto essere creato |
of_queue_count ( ) → long | Rende il numero di suoni ancora in attesa |
of_preload (string as_source) → long | Carica un suono senza suonarlo: il primo of_play di quella sorgente parte istantaneamente. Una sorgente illeggibile è segnalata da quell'of_play, tramite ue_failed. Rende 0 una volta fatto, -2 se il lettore non ha potuto essere creato |
of_fade_to (integer ai_volume, long al_ms) → long | Porta il volume a ai_volume (0-100) in al_ms ms sul suono in corso; il valore diventa ii_volume, e un suono suonato sopra nel frattempo non interrompe la dissolvenza. Rende 0 una volta fatto, -2 se il lettore non ha potuto essere creato |
of_play_named (string as_name) → long | Un suono SINTETIZZATO, senza file, al volume ii_volume: SOUND_SUCCESS, SOUND_ERROR, SOUND_WARNING, SOUND_INFO, SOUND_NOTIFY. Un canale a sé: of_play non lo interrompe, of_stop sì. Rende 0 una volta avviato, -2 se il lettore non ha potuto essere creato; un nome sconosciuto passa da ue_failed (REASON_UNKNOWN) |
of_play_named_sync (string as_name) → long | Lo stesso suono, e la chiamata ritorna alla sua fine. Rende 0, -2 se il lettore non ha potuto essere creato, -4 su un nome sconosciuto, senza uscita audio o se un altro suono sincrono attende già (is_last_error) |
of_has_output ( ) → boolean | Vero se la postazione ha un'uscita audio: da chiedere PRIMA di un allarme. Il suono va sempre all'uscita predefinita di Windows |
of_equalizer (boolean ab_on {, integer ai_gains[]}) → long | Equalizzatore a 5 bande (60 / 230 / 910 / 3600 / 14000 Hz, of_eq_frequencies dà i centri), guadagno in dB da -24 a 24 (un valore fuori limite è riportato al più vicino); l'overload imposta tutti i guadagni, of_equalizer_band uno in diretta. File LOCALI. Rende 0 una volta fatto, -2 se il lettore non ha potuto essere creato |
of_equalizer_band (integer ai_band, integer ai_gain) → long | Imposta il guadagno di UNA banda (ai_band da 1 a 5, ai_gain in dB, da -24 a 24) e lo applica subito al suono in corso — un cursore vostro mosso in diretta; le altre bande mantengono il loro guadagno. Rende 0, -5 se la banda è fuori limite, -2 se il lettore non ha potuto essere creato |
of_eq_frequencies (ref long al_freqs[]) → long | Riempie al_freqs con la frequenza centrale di ogni banda, in Hz e in ordine (60, 230, 910, 3600, 14000) — ciò che un'etichetta di banda tua mostra. Rende il numero di bande, 5 |
of_meter (boolean ab_on {, integer ai_bars}) → long | Accende un vu-meter / analizzatore: interrogate poi of_level (0-100) e of_spectrum (ai_bars barre) da un timer per disegnare il vostro visualizzatore. File LOCALI. Rende 0 una volta fatto, -2 se il lettore non ha potuto essere creato |
of_level ( ) → long | Rende il livello sonoro dell'istante, 0 a 100, letto dal vivo — l'ago di un VU meter; 0 quando il meter (of_meter) è spento o nulla suona. Da interrogare da un timer |
of_spectrum (ref long al_bars[]) → long | Riempie al_bars con lo spettro, letto dal vivo: tanti valori quanti of_meter ha chiesto, 0 a 100 ciascuno, basse frequenze prima — le barre di un analizzatore tuo. Rende il numero di barre, 0 a meter spento |
of_crossfade (string as_source, long al_ms) → long | Dissolvenza incrociata: il suono corrente si spegne in al_ms mentre la nuova sorgente sale — un cambio di traccia senza interruzione; 0 passa subito. Il nuovo suono prende ii_volume, ii_rate, ii_pan e ib_loop, e un of_fade_to durante la salita prende il controllo. of_stop durante la dissolvenza ferma entrambi, e un of_play_sync che attendeva il primo suono ritorna. Rende 0 una volta avviato, -2 se il lettore non ha potuto essere creato; una sorgente vuota passa da ue_failed |
of_process_events ( ) | Svuota la coda degli eventi e li solleva sull'oggetto. Il pump interno del componente lo chiama per te finché il lettore è aperto — non lo chiami mai |
of_close ( ) | Libera il lettore, fermando prima il suono: un suono che suonava finisce con il suo ue_stopped, sollevato prima del ritorno; fatto per voi alla distruzione dell'oggetto |
of_reset ( ) | Ferma il suono e riporta ogni impostazione al valore predefinito |
Eventi #
| Evento | Quando |
|---|---|
ue_started (string as_source, long al_duration_ms) | Il suono parte davvero — un URL, una volta ricevuti abbastanza dati. al_duration_ms è la lunghezza quando il file la dice, 0 altrimenti |
ue_ended (string as_source, boolean ab_truncated) | Il suono è finito, da sé. ab_truncated è vero quando il limite demo l'ha tagliato, mai con licenza. Un suono in ciclo non finisce: si ferma |
ue_failed (string as_source, string as_message, string as_reason) | Il suono non ha potuto suonare. as_reason è una parola da testare, una costante REASON_*: REASON_INSECURE (indirizzo http://), REASON_FORMAT (formato rifiutato dal nome), REASON_UNSUPPORTED (file mancante, indirizzo file:// malformato), REASON_NETWORK, REASON_DECODE, REASON_NO_SOURCE, REASON_UNKNOWN (suono con nome inesistente), REASON_UNAVAILABLE (nessuna uscita audio), REASON_FAILED; as_message è la frase da mostrare. Un suono della coda che fallisce non ferma la coda |
ue_stopped ( ) | Sollevato una volta quando of_stop (o of_close, o la fine di il_timeout_ms) ha interrotto ciò che suonava — non quando un suono finisce da solo, quello è ue_ended |
ue_paused ( ) / ue_resumed ( ) | Il suono è sospeso, poi riprende |
ue_progress (long al_position_ms, long al_duration_ms) | Una volta al secondo di orologio durante la riproduzione, qualunque sia ii_rate: posizione e durata |
ue_queue_done ( ) | L'ultimo suono della coda (of_enqueue) è finito |
Più suoni, dissolvenze, coda #
- Il canale principale e la sovrapposizione.
of_play,of_pause,of_seek,of_stoppilotano UN suono: una musica, una suoneria.of_play_overne suona un secondo sopra, senza tagliare nulla — un allarme su uno sfondo.ue_endednomina ciascuno dalla sua sorgente. Ogni verbo regola il PROPRIO suono:ii_volumeeii_rateconsegnati conof_play_overvalgono per la sovrapposizione, non per lo sfondo — un allarme a 100 su uno sfondo abbassato a 20 daof_fade_to, lo sfondo resta a 20. I bip e i suoni con nome sono canali a sé:of_playnon li interrompe, soloof_stopinterrompe tutto. - La coda.
of_enqueueattende la fine del suono in corso;ue_queue_donedice quando l'ultimo è finito. Un suono che fallisce (ue_failed) non zittisce i successivi.of_playresta il verbo che taglia. - Le dissolvenze.
il_fade_msfa salire ogni avvio dal silenzio e spegnere ogni stop;of_fade_toabbassa lo sfondo durante un annuncio. Niente di brusco. - I suoni nominati.
of_play_named(SOUND_SUCCESS)e i suoi quattro fratelli sono sintetizzati: nulla da consegnare, nulla da cercare sul disco. - Prima dell'allarme.
of_preloadapre il file in anticipo,of_has_outputdice se la postazione ha un'uscita. Il suono va all'uscita predefinita di Windows: il motore dà l'id di un'uscita solo a una pagina con accesso ai media, che una postazione ordinaria non concede — scegliere un'uscita non è quindi proposto. - Il bilanciamento (
ii_pan) vale per i file della postazione. Un URL suona senza bilanciamento: il browser rifiuta di far entrare un suono di un altro sito nel suo grafo audio (CORS), e non è un'impostazione. - Nessuna registrazione. Catturare il microfono è un altro componente; questo suona.
// 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)
Esempi #
Un segnale a due note, senza alcun file #
// 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)
Un mp3 scelto dall'utente, con una barra di avanzamento #
// 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
Una suoneria in ciclo finché l'utente agisce #
// 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()
Buone pratiche #
- Un solo oggetto per finestra, aperto con essa (
of_open): il lettore nascosto costa qualche centinaio di millisecondi la prima volta, nulla dopo. of_play_syncblocca il tuo script, e il mouse oltre 250 ms: la finestra si ridisegna, ma tutti i componenti PBToolboxAI dell'applicazione mostrano la clessidra e ignorano i clic fino al ritorno; e gli eventi del componente come i timer delle vostre finestre continuano ad arrivare durante l'attesa — un suono sincrono chiesto da uno di essi è rifiutato (-4). Riservalo ai suoni brevi — un carillon, un avviso — e usaof_playper la musica.- Un file mancante non è un'eccezione:
of_play_syncrende-4,of_playsollevaue_failed, eis_last_errornomina il file.