PBToolboxAI v4 ← Site

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 PlaySound limitato 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 visualen_pbt_soundplayer
Serve aUn carillon prima di un messaggio, un avviso, una musica d'attesa, un mp3 scelto dall'utente, un flusso da Internet
PrincipioUna pagina nascosta porta un lettore; of_play ritorna subito e gli eventi raccontano il resto, of_play_sync attende la fine del suono
DipendenzaIl 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 #


Proprietà #

ProprietàTipoPredefinitoRuolo
ii_volumeinteger100Volume 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_loopbooleanfalseVero 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_errorstring""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_mslong300000La 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_rateinteger100Velocità 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_paninteger0Bilanciamento 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_mslong0Dissolvenza in millisecondi: ogni avvio sale dal silenzio, ogni stop o pausa si spegne
ipo_ownerpowerobjectnullL'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 #

MetodoRuolo
of_open ( ) → longCrea 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 ( ) → booleanVero appena il lettore esiste
of_play (string as_source {, long al_start_ms}) → longSuona 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) → longSuona 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) → longUn 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) → longLo 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 ( ) → longSospende il suono dov'è; of_resume lo riprende. Rende 0 una volta fatto, -2 se il lettore non ha potuto essere creato
of_resume ( ) → longRiprende 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) → longSi 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 ( ) → booleanVero finché un suono, un bip, un suono con nome o una sovrapposizione è in corso — un suono in pausa conta, non è finito
of_is_paused ( ) → booleanVero finché il suono è sospeso da of_pause
of_duration ( ) → longLa lunghezza del suono in millisecondi, 0 finché sconosciuta; anche ue_started la porta
of_position ( ) → longDov'è il suono, in millisecondi — da leggere da un timer per far avanzare una tua barra di avanzamento
of_source ( ) → stringCiò che of_play ha ricevuto per ultimo, tale e quale
of_play_over (string as_source) → longSuona 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) → longMette 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 ( ) → longDimentica 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 ( ) → longRende il numero di suoni ancora in attesa
of_preload (string as_source) → longCarica 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) → longPorta 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) → longUn 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) → longLo 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 ( ) → booleanVero 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[]}) → longEqualizzatore 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) → longImposta 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[]) → longRiempie 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}) → longAccende 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 ( ) → longRende 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[]) → longRiempie 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) → longDissolvenza 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 #

EventoQuando
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 #

// 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 #

← Riferimento dei componenti · Sommario della guida