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
inv_sound.ii_volume = 60
inv_sound.of_play(/*source*/ "https://example.org/music/lobby.mp3")
// When the window closes : the hidden player goes with the object
destroy inv_sound
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.
Dove scrivere gli event #
Un oggetto creato da create n_pbt_soundplayer serve benissimo i suoni sincroni e quelli avviati senza attendere notizie — è ciò che fa l'avvio rapido —, ma i suoi eventi non hanno alcuno script: PowerBuilder non permette di scrivere ue_ended su un oggetto creato in uno script. Per reagire agli eventi, due vie:
- l'oggetto posato nella finestra (o nell'oggetto utente): nel painter, inserite un oggetto non visuale
n_pbt_soundplayere chiamateloinv_sound; i suoi eventiue_started,ue_ended,ue_failed… si scrivono allora come quelli di un controllo, e nasce e muore con la finestra — è ciò che fa l'applicazione dimostrativa; - un discendente: ereditate da
n_pbt_soundplayer(n_my_sounds), scriveteue_endedin quel discendente, e createlo concreate n_my_sounds.
Non distruggete il lettore da uno dei suoi stessi eventi: of_close basta, e la distruzione dell'oggetto lo fa per voi.
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 subito (il metodo rende-5eof_get_last_error()dice perché; nella coda,ue_failedconREASON_INSECURE, al suo turno): 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. Un suono in ciclo non finisce mai: la coda (of_enqueue) attende dietro di esso fino a of_stop, of_next o of_stop_sound |
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 quel suono viene interrotto (segue ue_stopped) — solo lui: uno sfondo, le sovrapposizioni e la coda continuano. 0 o meno: 24 ore |
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 (al massimo 10 000): ogni avvio sale dal silenzio, ogni of_stop o pausa si spegne, una ripresa risale; ue_stopped arriva comunque subito |
ib_gapless_loop | boolean | false | Con ib_loop, un file BREVE della postazione va in ciclo senza interruzioni: decodificato una volta, si concatena senza cuciture — una suoneria, un tappeto musicale. Al massimo 4 MB e 60 secondi (oltre, ue_failed con REASON_TOO_LONG); un URL va in ciclo nel modo ordinario. Consegnato con il verbo, come ib_loop |
ib_muted | boolean | false | Tutti i suoni del lettore muti subito — il suono principale, le sovrapposizioni, i bip, i suoni con nome — ii_volume conservato: false riporta il suono allo stesso livello. In diretta |
ib_queue_repeat | boolean | false | La coda (of_enqueue) ricomincia dopo il suo ultimo suono, ancora e ancora; of_next dopo l'ultimo va al primo, of_previous prima del primo all'ultimo. Una coda i cui suoni falliscono tutti si ferma comunque. In diretta |
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_get_last_error ( ) → string | Perché l'ultima chiamata è fallita: file mancante, formato non decodificabile, indirizzo http://, URL muto, nessuna uscita audio, numero di un suono non più in corso. Riempito anche da ue_failed e dopo ogni -5. Dopo un of_play_sync che ha reso 0: "stopped" se il suono è stato interrotto invece che suonato fino alla fine |
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 (of_get_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, 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, senza evento; un bip o un suono con nome continua. Rende 0 una volta avviato, -5 se la sorgente è rifiutata subito — vuota, un indirizzo http://, un indirizzo file:// malformato, un formato rifiutato dal nome: of_get_last_error() dice quale, il suono in corso continua e nessun ue_failed segue —, -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 (of_get_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 (solo quel 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 valore oltre un limite vi è riportato. Un canale a sé: of_play non lo interrompe, of_stop sì. Ritorna subito; segue ue_ended. Rende 0 una volta avviato, -5 se al_hz o al_ms vale 0 o meno (una variabile non inizializzata non suona un bip predefinito), -2 se il lettore non ha potuto essere creato, -4 se la pagina non ha risposto |
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, -5 se al_hz o al_ms vale 0 o meno, -2 se il lettore non ha potuto essere creato, o -4 senza uscita audio, se il_timeout_ms è scaduto (solo il bip è interrotto) o se un altro suono sincrono attende già (of_get_last_error()) |
of_stop ( ) → long | 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, subito. Con il_fade_ms, il suono principale si spegne in quel tempo invece di fermarsi di colpo Rende 0 una volta fatto. |
of_pause ( ) → long | Sospende il suono dov'è (su il_fade_ms); of_resume lo riprende. Rende 0 una volta fatto, -5 se non c'è nulla da sospendere — nessun suono principale, o già in pausa; un bip o una sovrapposizione non si sospendono —, -2 se il lettore non ha potuto essere creato, -4 se la pagina non ha risposto |
of_resume ( ) → long | Riprende il suono dove of_pause l'ha lasciato. Rende 0 una volta fatto, -5 se nessun suono è in pausa, -2 se il lettore non ha potuto essere creato, -4 se la pagina non ha risposto |
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: il lettore non conserva alcun suono fermato in cui spostarsi. 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); of_stop_sound lo ferma da solo, of_stop con il resto. Rende il numero del suono (> 0) — i suoi eventi lo portano, due sovrapposizioni dello stesso file si distinguono grazie a esso —, -5 se la sorgente è rifiutata subito, -2 se il lettore non ha potuto essere creato, -4 se la pagina non ha risposto |
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 in ciclo non finisce mai, la coda attende dietro di esso. Un suono che non può suonare solleva ue_failed al suo turno e la coda continua. La coda conserva ciò che ha suonato: of_next, of_previous. Rende il numero del suono (> 0), -2 se il lettore non ha potuto essere creato, -4 se la pagina non ha risposto |
of_clear_queue ( ) → long | Dimentica la coda — i suoni in attesa e quelli che ha già suonato —, senza interrompere quello che suona; ue_queue_done segue comunque la sua fine. Rende 0 una volta fatto, -2 se il lettore non ha potuto essere creato, -4 se la pagina non ha risposto |
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. Un file che si rivela illeggibile è segnalato da quell'of_play, tramite ue_failed. Rende 0 una volta fatto, -5 se la sorgente è rifiutata subito (of_get_last_error() dice perché), -2 se il lettore non ha potuto essere creato, -4 se la pagina non ha risposto |
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à (of_get_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 (una banda che l'array non raggiunge torna a 0), 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, -5 se ai_bars esce da 1 a 64 (nulla cambia), -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 (al massimo 10 000) 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; il suono sostituito non solleva nulla. Rende 0 una volta avviato, -5 se la sorgente è rifiutata subito — il suono in corso continua allora, intatto —, -2 se il lettore non ha potuto essere creato, -4 se la pagina non ha risposto |
of_play_range (string as_source, long al_from_ms, long al_to_ms) → long | Suona un SEGMENTO di un file, da al_from_ms a al_to_ms — una banca di suoni brevi in un solo file, ognuno suonato dai suoi limiti. Sostituisce il suono principale come of_play, con le sue impostazioni; con ib_loop il segmento risuona dal suo inizio. ue_ended alla sua fine. Rende 0 una volta avviato, -5 se al_from_ms è negativo, al_to_ms non viene dopo, o la sorgente è rifiutata subito, -2 se il lettore non ha potuto essere creato, -4 se la pagina non ha risposto |
of_stop_sound (long al_sound) → long | Ferma UN suono tramite il suo numero (of_play_over e of_enqueue lo rendono, gli eventi lo portano): una sovrapposizione — le altre continuano —, il suono principale (su il_fade_ms, la coda passando al successivo), un bip, un suono con nome; segue un ue_stopped. Un suono ancora IN ATTESA è tolto dalla coda, senza evento. Rende 0 una volta fatto, -5 se nessun suono porta ora quel numero, -2 se il lettore non ha potuto essere creato, -4 se la pagina non ha risposto |
of_next ( ) → long | Suona subito il suono SUCCESSIVO della coda — il suono in corso è sostituito, senza evento; con ib_queue_repeat, dopo l'ultimo viene il primo. ue_source_changed dice dove si trova la coda. Rende 0 una volta fatto, -5 se non c'è un suono successivo, -2 se il lettore non ha potuto essere creato, -4 se la pagina non ha risposto |
of_previous ( ) → long | Suona il suono PRIMA di quello in corso nella coda — la coda conserva ciò che ha suonato; coda ferma, l'ultimo suonato di nuovo. Con ib_queue_repeat, prima del primo viene l'ultimo. Rende 0 una volta fatto, -5 se non ce n'è, -2 se il lettore non ha potuto essere creato, -4 se la pagina non ha risposto |
of_queue_index ( ) → long | Rende il posto nella coda (1 = il primo suono messo in coda) del suono in corso, 0 quando quel suono non viene dalla coda o nulla suona |
of_is_buffering ( ) → boolean | Vero finché il suono gira ma attende i suoi dati — il tempo annunciato da ue_buffering: un flusso di Internet che si blocca, un salto lontano in un file letto da un URL. Un file della postazione non attende mai |
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 ( ) → long | Libera il lettore, fermando prima il suono, subito (senza dissolvenza): un suono che suonava finisce con il suo ue_stopped, sollevato prima del ritorno; fatto per voi alla distruzione dell'oggetto. Non distruggete il lettore da uno dei suoi eventi: of_close basta Rende 0 una volta fatto. |
of_reset ( ) → long | Ferma il suono e riporta ogni impostazione al valore predefinito Rende 0 una volta fatto. |
Eventi #
| Evento | Quando |
|---|---|
ue_started (string as_source, long al_duration_ms, long al_sound) | Il suono parte davvero — un URL, una volta ricevuti abbastanza dati. al_duration_ms è la lunghezza quando il file la dice, 0 altrimenti; al_sound è il numero del suono |
ue_ended (string as_source, boolean ab_truncated, long al_sound) | 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. Un suono principale SOSTITUITO da un altro (of_play, of_crossfade, of_next…) non solleva nulla: è il vostro script che l'ha sostituito |
ue_failed (string as_source, string as_message, string as_reason, long al_sound) | Il suono non ha potuto suonare — una sorgente rifiutata subito da un metodo è il suo -5, non questo evento. 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_TOO_LONG (un ciclo senza interruzioni di un file troppo lungo), REASON_FAILED (il resto, un errore di script della pagina compreso); as_message è la frase da mostrare, nella lingua di visualizzazione; al_sound il numero del suono. Un suono della coda che fallisce non ferma la coda |
ue_stopped ( ) | Sollevato una volta quando of_stop (o of_close, of_stop_sound, o la fine di il_timeout_ms per il suono di quella chiamata) 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 — mai con ib_queue_repeat, la coda ricomincia |
ue_buffering (boolean ab_on) | ab_on vero: il suono gira ma attende i suoi dati — un flusso di Internet che si blocca, un salto lontano in un file letto da un URL; falso: riparte (o è messo in pausa, fermato, sostituito, in errore). Un'attesa di meno di un quarto di secondo non dice nulla |
ue_source_changed (long al_index, string as_source) | La coda passa a uno dei suoi suoni — da sé, tramite of_next, of_previous o ib_queue_repeat: al_index è il suo posto nella coda (1 = il primo suono messo in coda), as_source ciò che è stato messo in coda |
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. 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. Un suono principale sostituito (of_play,of_crossfade,of_next) non solleva nulla: è il vostro script che lo sostituisce. - Il numero di un suono.
of_play_overeof_enqueuerendono un numero (> 0), cheue_started,ue_endedeue_failedportano inal_sound: due allarmi dello stesso file si distinguono, eof_stop_soundne ferma uno solo. - 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. La coda conserva ciò che ha suonato:of_nexteof_previousvi si spostano,of_queue_indexdice dove si trova,ue_source_changedannuncia ogni passaggio,ib_queue_repeatla fa ricominciare. Un suono in ciclo non finisce mai: la coda attende dietro di esso.of_playresta il verbo che taglia. - Le dissolvenze.
il_fade_ms(al massimo 10 000 ms) fa salire ogni avvio dal silenzio e spegnere ogniof_stopo pausa;of_fade_toabbassa lo sfondo durante un annuncio. Niente di brusco. - Un ciclo senza interruzioni.
ib_gapless_loopdecodifica una volta un file breve della postazione e lo concatena senza cuciture: la suoneria non lascia più una pausa a ogni giro. - Un segmento.
of_play_rangesuona un pezzo di un file, da un millisecondo a un altro: una banca di suoni in un solo file. - Il muto.
ib_mutedzittisce tutto, in diretta, senza perdereii_volume. - 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. - Un flusso che si blocca.
ue_bufferingdice quando un suono attende i suoi dati, poi quando riparte;of_is_bufferinglo legge. - 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)
// Local variables
long ll_first
// Two alerts of the same file : each one has its own number
ll_first = inv_sound.of_play_over(/*source*/ "C:\Windows\Media\Alarm01.wav")
inv_sound.of_play_over(/*source*/ "C:\Windows\Media\Alarm01.wav")
// Later : the first one stopped alone, the other goes on
inv_sound.of_stop_sound(/*sound*/ ll_first)
// A queue that starts over after its last sound, and the next sound right now
inv_sound.ib_queue_repeat = true
inv_sound.of_next()
// A ring that loops without a gap, then everything silent for a moment
inv_sound.ib_loop = true
inv_sound.ib_gapless_loop = true
inv_sound.of_play(/*source*/ "C:\Windows\Media\Ring05.wav")
inv_sound.ib_muted = true
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
constant unsignedlong OFN_EXPLORER = 2
constant unsignedlong OFN_NOCHANGEDIR = 64
// Let the user pick a music file - in the Explorer style, without moving the current folder of the application - then play it
if GetFileOpenName("Music", ls_path, ls_file, "mp3", "Music (*.mp3;*.wav;*.flac),*.mp3;*.wav;*.flac", /*initdir*/ "", OFN_EXPLORER + OFN_NOCHANGEDIR) = 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, eof_get_last_error()nomina il file. - Non distruggete il lettore da uno dei suoi eventi: durante una chiamata sincrona i suoi eventi continuano ad arrivare, e un
destroyin uno di essi lascia la chiamata riprendere su un oggetto distrutto.of_closebasta. - Una sorgente rifiutata subito non è un evento:
-5eof_get_last_error(), immediatamente; solo la coda la segnala conue_failed, al suo turno.