soundplayer — n_pbt_soundplayer #
← Référence des composants · Sommaire du guide
Joue un son ou une musique — un fichier du poste ou une URL — de manière asynchrone (des événements) ou synchrone (l'appel revient quand le son est fini), et un bip pur sans aucun fichier. Tous les formats que le moteur WebView2 décode : mp3, wav, ogg, opus, flac, aac, m4a, mp4, webm. Aucune DLL tierce, aucun
PlaySoundlimité au wav.
▶ Le voir en vrai — Application de démonstration, tuile Sound player : les sons, le code qui les joue et cette page, côte à côte.
En bref #
| Objet non visuel | n_pbt_soundplayer |
| Sert à | Un carillon avant un message, une alerte, une musique d'attente, un mp3 choisi par l'utilisateur, un flux d'Internet |
| Principe | Une page cachée porte un lecteur ; of_play revient tout de suite et les événements racontent la suite, of_play_sync attend la fin du son |
| Dépendance | Le runtime WebView2, déjà requis par la bibliothèque — rien d'autre |
Démarrage rapide #
// 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
Les événements ue_* sont livrés tout seuls — le composant les draine lui-même tant que le lecteur est ouvert et les lève sur le composant : rien à câbler, ni receveur ni timer.
Où écrire les événements #
Un objet créé par create n_pbt_soundplayer sert très bien les sons synchrones et ceux qu'on lance sans attendre de nouvelles — c'est ce que fait le démarrage rapide —, mais ses événements n'ont aucun script : PowerBuilder ne permet pas d'écrire ue_ended sur un objet créé dans un script. Pour réagir aux événements, deux voies :
- l'objet posé dans la fenêtre (ou l'objet utilisateur) : dans le peintre, insérez un objet non visuel
n_pbt_soundplayeret nommez-leinv_sound; ses événementsue_started,ue_ended,ue_failed… se scriptent alors comme ceux d'un contrôle, et il naît et meurt avec la fenêtre — c'est ce que fait l'application de démonstration ; - un descendant : héritez de
n_pbt_soundplayer(n_my_sounds), écrivezue_endeddans ce descendant, et créez-le parcreate n_my_sounds.
Ne détruisez pas le lecteur depuis l'un de ses propres événements : of_close suffit, et la destruction de l'objet le fait pour vous.
Fichier ou URL, et pourquoi un long morceau démarre tout de suite #
- Un fichier du poste est n'importe quel chemin que PowerBuilder sait nommer — absolu, relatif au dossier de l'application, réseau. La DLL le sert au lecteur en flux, par tranches, avec les requêtes de plage qu'un lecteur émet pour avancer dans le morceau : rien n'est chargé en mémoire, et
of_seekest immédiat. - Une URL
httpsest passée telle quelle : le son démarre dès que le début est arrivé. Une adressehttp://est refusée d'emblée (la méthode rend-5etof_get_last_error()dit pourquoi ; dans la file,ue_failedavecREASON_INSECURE, à son tour) : la page du lecteur est servie en https, et le moteur « monterait » l'adresse en https ou la bloquerait — un serveur d'intranet sans TLS passerait pour introuvable. Téléchargez-la d'abord (restclient.of_downloadvers un fichier temporaire). Un média n'est pas soumis au CORS, contrairement à un appel d'API — voirrestclientpour ce cas-là. - Un bip (
of_beep,of_beep_sync) n'a besoin d'aucun fichier : un oscillateur du moteur audio, à la fréquence et pour la durée que vous donnez.
Propriétés #
| Propriété | Type | Défaut | Rôle |
|---|---|---|---|
ii_volume | integer | 100 | Volume en pour cent, 0 à 100, remis avec le verbe qui lance un son — et c'est le volume de CE son : of_play, of_play_sync et of_crossfade règlent le son principal ; of_play_over, of_beep et of_play_named jouent le leur à ce volume sans toucher au son principal (une alerte à 100 sur un fond baissé à 20) ; un son mis en file par of_enqueue le garde pour son tour. Changé pendant qu'un son joue, il attend le verbe suivant — seul of_fade_to change le son qui joue |
ib_loop | boolean | false | Vrai pour rejouer le son en boucle jusqu'à of_stop — une sonnerie, une musique de fond. Remis avec le son suivant. of_play_sync l'ignore : un son synchrone joue une fois, une boucle n'a pas de fin à attendre. Un son en boucle ne finit jamais : la file (of_enqueue) attend derrière lui jusqu'à of_stop, of_next ou of_stop_sound |
il_timeout_ms | long | 300000 | Durée maximale d'un son synchrone (of_play_sync, of_beep_sync, of_play_named_sync) ; cinq minutes par défaut. Passé ce délai l'appel rend -4 et ce son est coupé (ue_stopped suit) — lui seul : un fond, les superpositions et la file continuent. 0 ou moins : 24 heures |
ii_rate | integer | 100 | Vitesse en pour cent (25 à 400), remise avec le verbe qui lance un son, pour CE son : le son principal, ou une superposition (of_play_over) sans changer le principal |
ii_pan | integer | 0 | Balance du son PRINCIPAL, de -100 (gauche) à 100 (droite), remise avec of_play, of_play_sync ou of_crossfade, pour les FICHIERS ; une URL joue sans balance |
il_fade_ms | long | 0 | Fondu en millisecondes (10 000 au plus) : chaque départ monte du silence, chaque of_stop ou pause s'éteint, une reprise remonte ; ue_stopped arrive quand même tout de suite |
ib_gapless_loop | boolean | false | Avec ib_loop, un fichier COURT du poste boucle sans blanc : décodé une fois, il s'enchaîne sans couture — une sonnerie, un fond musical. 4 Mo et 60 secondes au plus (au-delà, ue_failed avec REASON_TOO_LONG) ; une URL boucle à la manière ordinaire. Remis avec le verbe, comme ib_loop |
ib_muted | boolean | false | Tous les sons du lecteur muets tout de suite — le son principal, les superpositions, les bips, les sons nommés — ii_volume gardé : false rend le son au même niveau. En direct |
ib_queue_repeat | boolean | false | La file (of_enqueue) recommence après son dernier son, encore et encore ; of_next après le dernier va au premier, of_previous avant le premier au dernier. Une file dont tous les sons échouent s'arrête quand même. En direct |
ipo_owner | powerobject | null | L'objet visuel pour lequel ce lecteur travaille : la licence se vérifie sur sa classe. Nécessaire seulement dans l'application de démonstration ; une clé de développement ou d'exécution débride le lecteur sans lui. Non débridé, le lecteur est en mode démo — seules les 10 premières secondes d'un son sont jouées |
Méthodes #
| Méthode | Rôle |
|---|---|
of_get_last_error ( ) → string | Pourquoi le dernier appel a échoué : fichier absent, format non décodable, adresse http://, URL muette, pas de sortie audio, numéro d'un son qui n'est plus en cours. Rempli aussi par ue_failed et après chaque -5. Après un of_play_sync qui a rendu 0 : "stopped" si le son a été coupé plutôt que joué jusqu'au bout |
of_open ( ) → long | Crée le lecteur. Facultatif — chaque méthode le fait — mais l'appeler à l'ouverture de la fenêtre paie le coût une fois. Rend le handle (> 0), ou -2 si le lecteur n'a pas pu naître (of_get_last_error() dit pourquoi) |
of_is_open ( ) → boolean | Vrai dès que le lecteur existe |
of_play (string as_source {, long al_start_ms}) → long | Joue sans attendre : fichier du poste ou URL https, la fin vient par ue_ended. al_start_ms fait partir le son de ce point (en mode démo, jamais au-delà des 10 premières secondes). Le son principal en cours est remplacé, sans événement ; un bip ou un son nommé continue. Rend 0 une fois lancé, -5 si la source est refusée d'emblée — vide, adresse http://, adresse file:// mal formée, format refusé par son nom : of_get_last_error() dit lequel, le son en cours continue et aucun ue_failed ne suit —, -2 si le lecteur n'a pas pu naître, -4 si la page n'a pas répondu |
of_play_sync (string as_source) → long | Joue et attend la fin : l'appel revient quand le son est fini (ou arrêté). La fenêtre continue de se peindre, mais passé 250 ms tous les composants PBToolboxAI de l'application montrent le sablier et ignorent la souris jusqu'au retour : réservez-le aux sons courts. Joue une fois, quoi que dise ib_loop. Rend 0 une fois le son terminé (of_get_last_error() = "stopped" s'il a été coupé), -2 si le lecteur n'a pas pu naître, -4 s'il n'a pas pu jouer, si il_timeout_ms est écoulé (ce son seul est coupé) ou si un autre son synchrone attend déjà |
of_beep (long al_hz, long al_ms) → long | Un son pur sans fichier : al_hz (20 à 20 000) pendant al_ms millisecondes (10 à 5 000), au volume ii_volume ; une valeur au-delà d'une borne y est ramenée. Un canal à part : of_play ne le coupe pas, of_stop si. Revient tout de suite ; ue_ended suit. Rend 0 une fois lancé, -5 si al_hz ou al_ms vaut 0 ou moins (une variable non initialisée ne sonne pas un bip par défaut), -2 si le lecteur n'a pas pu naître, -4 si la page n'a pas répondu |
of_beep_sync (long al_hz, long al_ms) → long | Le même son, et l'appel revient quand il est fini : deux de suite font un signal à deux notes. Rend 0, -5 si al_hz ou al_ms vaut 0 ou moins, -2 si le lecteur n'a pas pu naître, ou -4 sans sortie audio, si il_timeout_ms est écoulé (le bip seul est coupé) ou si un autre son synchrone attend déjà (of_get_last_error()) |
of_stop ( ) → long | Arrête tout ce que joue le lecteur — le son, un bip, un son nommé, les superpositions, un fondu enchaîné — et vide la file ; un ue_stopped suit, tout de suite. Avec il_fade_ms, le son principal s'éteint sur cette durée au lieu de s'arrêter net Rend 0 une fois fait. |
of_pause ( ) → long | Suspend le son où il est (sur il_fade_ms) ; of_resume le reprend. Rend 0 une fois fait, -5 s'il n'y a rien à suspendre — aucun son principal, ou déjà en pause ; un bip ou une superposition ne se suspendent pas —, -2 si le lecteur n'a pas pu naître, -4 si la page n'a pas répondu |
of_resume ( ) → long | Reprend le son où of_pause l'a laissé. Rend 0 une fois fait, -5 si aucun son n'est en pause, -2 si le lecteur n'a pas pu naître, -4 si la page n'a pas répondu |
of_seek (long al_ms) → long | Se place à une position du son, en millisecondes depuis son début. En mode démo, jamais au-delà des 10 premières secondes. Pour PARTIR d'une position, of_play en prend une : le lecteur ne garde aucun son arrêté où se déplacer. Rend 0 une fois fait, -5 si aucun son ne joue (rien à déplacer), -2 si le lecteur n'a pas pu naître, -4 si la page n'a pas répondu |
of_is_playing ( ) → boolean | Vrai tant qu'un son, un bip, un son nommé ou une superposition est en cours — un son en pause compte, il n'est pas fini |
of_is_paused ( ) → boolean | Vrai tant que le son est suspendu par of_pause |
of_duration ( ) → long | La longueur du son en millisecondes, 0 tant qu'elle est inconnue ; ue_started la porte aussi |
of_position ( ) → long | Où en est le son, en millisecondes — à lire depuis un timer pour faire avancer une barre de progression à vous |
of_source ( ) → string | Ce que of_play a reçu en dernier, tel quel |
of_play_over (string as_source) → long | Joue un son PAR-DESSUS ce qui joue, sans le couper, à ii_volume et ii_rate — les siens : le fond garde les siens (un fond baissé par of_fade_to reste bas sous une alerte à 100) ; of_stop_sound l'arrête seul, of_stop avec le reste. Rend le numéro du son (> 0) — ses événements le portent, deux superpositions du même fichier se distinguent par lui —, -5 si la source est refusée d'emblée, -2 si le lecteur n'a pas pu naître, -4 si la page n'a pas répondu |
of_enqueue (string as_source) → long | Met un son en FILE : joué tout de suite si le lecteur est libre, après le son (ou le bip, ou le son nommé) en cours sinon, jamais coupé. Le son mis en file garde ii_volume, ii_rate et ib_loop tels qu'ils sont à l'appel, pour son tour ; un son en boucle ne finit jamais, la file attend derrière lui. Un son qui ne peut pas jouer lève ue_failed à son tour et la file continue. La file garde ce qu'elle a joué : of_next, of_previous. Rend le numéro du son (> 0), -2 si le lecteur n'a pas pu naître, -4 si la page n'a pas répondu |
of_clear_queue ( ) → long | Oublie la file — les sons en attente et ceux qu'elle a déjà joués —, sans couper celui qui joue ; ue_queue_done suit quand même sa fin. Rend 0 une fois fait, -2 si le lecteur n'a pas pu naître, -4 si la page n'a pas répondu |
of_queue_count ( ) → long | Rend le nombre de sons encore en attente |
of_preload (string as_source) → long | Charge un son sans le jouer : le premier of_play de cette source démarre instantanément. Un fichier qui se révèle illisible est signalé par cet of_play, via ue_failed. Rend 0 une fois fait, -5 si la source est refusée d'emblée (of_get_last_error() dit pourquoi), -2 si le lecteur n'a pas pu naître, -4 si la page n'a pas répondu |
of_fade_to (integer ai_volume, long al_ms) → long | Amène le volume à ai_volume (0 à 100) en al_ms ms sur le son qui joue ; la cible devient ii_volume, et un son joué par-dessus pendant ce temps n'interrompt pas le fondu. Rend 0 une fois fait, -2 si le lecteur n'a pas pu naître |
of_play_named (string as_name) → long | Un son SYNTHÉTISÉ, sans fichier, au volume ii_volume : SOUND_SUCCESS, SOUND_ERROR, SOUND_WARNING, SOUND_INFO, SOUND_NOTIFY. Un canal à part : of_play ne le coupe pas, of_stop si. Rend 0 une fois lancé, -2 si le lecteur n'a pas pu naître ; un nom inconnu passe par ue_failed (REASON_UNKNOWN) |
of_play_named_sync (string as_name) → long | Le même son, et l'appel rend la main à sa fin. Rend 0, -2 si le lecteur n'a pas pu naître, -4 sur un nom inconnu, sans sortie audio ou si un autre son synchrone attend déjà (of_get_last_error()) |
of_has_output ( ) → boolean | Vrai si le poste a une sortie audio : à demander AVANT une alerte. Le son part toujours sur la sortie par défaut de Windows |
of_equalizer (boolean ab_on {, integer ai_gains[]}) → long | Égaliseur 5 bandes (60 / 230 / 910 / 3600 / 14000 Hz, of_eq_frequencies donne les centres), gain en dB de -24 à 24 (une valeur hors bornes est ramenée à la plus proche) ; la surcharge pose tous les gains (une bande que le tableau n'atteint pas revient à 0), of_equalizer_band en pose un en direct. Fichiers LOCAUX. Rend 0 une fois fait, -2 si le lecteur n'a pas pu naître |
of_equalizer_band (integer ai_band, integer ai_gain) → long | Pose le gain d'UNE bande (ai_band 1 à 5, ai_gain en dB, -24 à 24) et l'applique aussitôt au son qui joue — un curseur à vous bougé en direct ; les autres bandes gardent leur gain. Rend 0, -5 si la bande est hors bornes, -2 si le lecteur n'a pas pu naître |
of_eq_frequencies (ref long al_freqs[]) → long | Remplit al_freqs avec la fréquence centrale de chaque bande, en Hz et dans l'ordre (60, 230, 910, 3600, 14000) — ce qu'une étiquette de bande à vous affiche. Rend le nombre de bandes, 5 |
of_meter (boolean ab_on {, integer ai_bars}) → long | Allume un vumètre / analyseur : sondez ensuite of_level (0 à 100) et of_spectrum (ai_bars barres) depuis un timer pour dessiner votre propre visualiseur. Fichiers LOCAUX. Rend 0 une fois fait, -5 si ai_bars sort de 1 à 64 (rien ne change), -2 si le lecteur n'a pas pu naître |
of_level ( ) → long | Rend le niveau sonore de l'instant, 0 à 100, lu en direct — l'aiguille d'un vumètre ; 0 quand le vumètre (of_meter) est éteint ou que rien ne joue. À sonder depuis un timer |
of_spectrum (ref long al_bars[]) → long | Remplit al_bars avec le spectre, lu en direct : autant de valeurs que of_meter a demandé, 0 à 100 chacune, graves d'abord — les barres d'un analyseur à vous. Rend le nombre de barres, 0 vumètre éteint |
of_crossfade (string as_source, long al_ms) → long | Fondu enchaîné : le son courant s'éteint en al_ms (10 000 au plus) pendant que la nouvelle source monte — un changement de piste sans coupure ; 0 bascule tout de suite. Le nouveau son prend ii_volume, ii_rate, ii_pan et ib_loop, et un of_fade_to pendant la montée prend la main. of_stop pendant le fondu arrête les deux, et un of_play_sync qui attendait le premier son rend la main ; le son remplacé ne lève rien. Rend 0 une fois lancé, -5 si la source est refusée d'emblée — le son en cours continue alors, intact —, -2 si le lecteur n'a pas pu naître, -4 si la page n'a pas répondu |
of_play_range (string as_source, long al_from_ms, long al_to_ms) → long | Joue un SEGMENT d'un fichier, de al_from_ms à al_to_ms — une banque de sons courts dans un seul fichier, chacun joué par ses bornes. Remplace le son principal comme of_play, avec ses réglages ; avec ib_loop le segment rejoue depuis son début. ue_ended à sa fin. Rend 0 une fois lancé, -5 si al_from_ms est négatif, al_to_ms pas après lui, ou la source refusée d'emblée, -2 si le lecteur n'a pas pu naître, -4 si la page n'a pas répondu |
of_stop_sound (long al_sound) → long | Arrête UN son par son numéro (of_play_over et of_enqueue le rendent, les événements le portent) : une superposition — les autres continuent —, le son principal (sur il_fade_ms, la file passant au suivant), un bip, un son nommé ; un ue_stopped suit. Un son encore EN ATTENTE est retiré de la file, sans événement. Rend 0 une fois fait, -5 si aucun son ne porte ce numéro maintenant, -2 si le lecteur n'a pas pu naître, -4 si la page n'a pas répondu |
of_next ( ) → long | Joue tout de suite le son SUIVANT de la file — le son en cours est remplacé, sans événement ; avec ib_queue_repeat, après le dernier vient le premier. ue_source_changed dit où en est la file. Rend 0 une fois fait, -5 s'il n'y a pas de son suivant, -2 si le lecteur n'a pas pu naître, -4 si la page n'a pas répondu |
of_previous ( ) → long | Joue le son AVANT celui qui joue dans la file — la file garde ce qu'elle a joué ; file au repos, le dernier joué de nouveau. Avec ib_queue_repeat, avant le premier vient le dernier. Rend 0 une fois fait, -5 s'il n'y en a pas, -2 si le lecteur n'a pas pu naître, -4 si la page n'a pas répondu |
of_queue_index ( ) → long | Rend la place dans la file (1 = le premier son mis en file) du son qui joue, 0 quand ce son ne vient pas de la file ou que rien ne joue |
of_is_buffering ( ) → boolean | Vrai tant que le son tourne mais attend ses données — le temps qu'a annoncé ue_buffering : un flux d'Internet qui se fige, un saut loin dans un fichier lu d'une URL. Un fichier du poste n'attend jamais |
of_process_events ( ) | Vide la file des événements et les lève sur l'objet. Le pump interne du composant l'appelle pour vous tant que le lecteur est ouvert — vous ne l'appelez jamais |
of_close ( ) → long | Libère le lecteur, en arrêtant le son d'abord, tout de suite (sans fondu) : un son qui jouait finit sur son ue_stopped, levé avant le retour ; fait pour vous à la destruction de l'objet. Ne détruisez pas le lecteur depuis l'un de ses événements : of_close suffit Rend 0 une fois fait. |
of_reset ( ) → long | Arrête le son et remet chaque réglage à sa valeur par défaut Rend 0 une fois fait. |
Événements #
| Événement | Quand |
|---|---|
ue_started (string as_source, long al_duration_ms, long al_sound) | Le son démarre vraiment — une URL, une fois assez de données reçues. al_duration_ms est la longueur quand le fichier la dit, 0 sinon ; al_sound est le numéro du son |
ue_ended (string as_source, boolean ab_truncated, long al_sound) | Le son est fini, de lui-même. ab_truncated est vrai quand la limite démo l'a coupé, jamais sous licence. Un son en boucle ne finit pas : il s'arrête. Un son principal REMPLACÉ par un autre (of_play, of_crossfade, of_next…) ne lève rien : c'est votre script qui l'a remplacé |
ue_failed (string as_source, string as_message, string as_reason, long al_sound) | Le son n'a pas pu jouer — une source refusée d'emblée par une méthode est son -5, pas cet événement. as_reason est un mot à tester, une constante REASON_* : REASON_INSECURE (adresse http://), REASON_FORMAT (format refusé par son nom), REASON_UNSUPPORTED (fichier absent, adresse file:// mal formée), REASON_NETWORK, REASON_DECODE, REASON_NO_SOURCE, REASON_UNKNOWN (son nommé inexistant), REASON_UNAVAILABLE (pas de sortie audio), REASON_TOO_LONG (une boucle sans blanc d'un fichier trop long), REASON_FAILED (le reste, une erreur de script de la page comprise) ; as_message est la phrase à montrer, dans la langue d'affichage ; al_sound le numéro du son. Un son de la file qui échoue n'arrête pas la file |
ue_stopped ( ) | Levé une fois quand of_stop (ou of_close, of_stop_sound, ou la fin de il_timeout_ms pour le son de cet appel) a coupé ce qui jouait — pas quand un son finit de lui-même, c'est ue_ended |
ue_paused ( ) / ue_resumed ( ) | Le son est suspendu, puis reprend |
ue_progress (long al_position_ms, long al_duration_ms) | Une fois par seconde d'horloge pendant la lecture, quelle que soit ii_rate : position et durée |
ue_queue_done ( ) | Le dernier son de la file (of_enqueue) est fini — jamais avec ib_queue_repeat, la file recommence |
ue_buffering (boolean ab_on) | ab_on vrai : le son tourne mais attend ses données — un flux d'Internet qui se fige, un saut loin dans un fichier lu d'une URL ; faux : il repart (ou est mis en pause, arrêté, remplacé, en erreur). Une attente de moins d'un quart de seconde ne dit rien |
ue_source_changed (long al_index, string as_source) | La file passe à l'un de ses sons — d'elle-même, par of_next, of_previous ou ib_queue_repeat : al_index est sa place dans la file (1 = le premier son mis en file), as_source ce qui a été mis en file |
Plusieurs sons, fondus, file d'attente #
- Le canal principal et la superposition.
of_play,of_pause,of_seek,of_stoppilotent UN son : une musique, une sonnerie.of_play_overen joue un second par-dessus, sans rien couper — une alerte sur un fond. Chaque verbe règle SON son :ii_volumeetii_rateremis avecof_play_overvalent pour la superposition, pas pour le fond — une alerte à 100 sur un fond baissé à 20 parof_fade_to, le fond reste à 20. Les bips et les sons nommés sont des canaux à part :of_playne les coupe pas, seulof_stopcoupe tout. Un son principal remplacé (of_play,of_crossfade,of_next) ne lève rien : c'est votre script qui le remplace. - Le numéro d'un son.
of_play_overetof_enqueuerendent un numéro (> 0), queue_started,ue_endedetue_failedportent dansal_sound: deux alertes du même fichier se distinguent, etof_stop_sounden arrête une seule. - La file.
of_enqueueattend la fin du son en cours ;ue_queue_donedit quand le dernier est fini. Un son qui échoue (ue_failed) ne fait pas taire les suivants. La file garde ce qu'elle a joué :of_nextetof_previouss'y déplacent,of_queue_indexdit où elle en est,ue_source_changedannonce chaque passage,ib_queue_repeatla fait recommencer. Un son en boucle ne finit jamais : la file attend derrière lui.of_playreste le verbe qui coupe, comme la lecture à voix haute du speechout. - Les fondus.
il_fade_ms(10 000 ms au plus) fait monter chaque départ depuis le silence et s'éteindre chaqueof_stopou pause ;of_fade_tobaisse le fond pendant une annonce. Rien de brutal. - Une boucle sans blanc.
ib_gapless_loopdécode une fois un fichier court du poste et l'enchaîne sans couture : la sonnerie ne marque plus de blanc à chaque tour. - Un segment.
of_play_rangejoue un morceau d'un fichier, de telle milliseconde à telle autre : une banque de sons dans un seul fichier. - Le muet.
ib_mutedcoupe tout, en direct, sans perdreii_volume. - Les sons nommés.
of_play_named(SOUND_SUCCESS)et ses quatre frères sont synthétisés : rien à livrer, rien à chercher sur le disque. - Avant l'alerte.
of_preloadouvre le fichier à l'avance,of_has_outputdit si le poste a une sortie. Le son part sur la sortie par défaut de Windows : le moteur ne donne l'identifiant d'une sortie qu'à une page autorisée à accéder aux médias, ce qu'un poste ordinaire n'accorde pas — choisir une sortie n'est donc pas proposé. - Un flux qui se fige.
ue_bufferingdit quand un son attend ses données, puis quand il repart ;of_is_bufferingle lit. - La balance (
ii_pan) vaut pour les fichiers du poste. Une URL joue sans balance : le navigateur refuse de faire entrer un son d'un autre site dans son graphe audio (CORS), et ce n'est pas un réglage. - Pas d'enregistrement. Capturer le micro est un autre composant ; celui-ci joue.
// 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
Exemples #
Un signal à deux notes, sans aucun fichier #
// 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 choisi par l'utilisateur, avec une barre de progression #
// 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
Une sonnerie en boucle jusqu'à l'action de l'utilisateur #
// 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()
Bonnes pratiques #
- Un seul objet par fenêtre, ouvert avec elle (
of_open) : le lecteur caché coûte quelques centaines de millisecondes la première fois, rien ensuite. of_play_syncbloque votre script, et la souris au-delà de 250 ms : la fenêtre se repeint, mais tous les composants PBToolboxAI de l'application montrent le sablier et ignorent les clics jusqu'au retour ; et les événements du composant comme les timers de vos fenêtres continuent d'arriver pendant l'attente — un son synchrone demandé depuis l'un d'eux est refusé (-4). Réservez-le aux sons courts — un carillon, une invite — et gardezof_playpour une musique.- Un fichier absent n'est pas une exception :
of_play_syncrend-4,of_playlèveue_failed, etof_get_last_error()nomme le fichier. - Ne détruisez pas le lecteur depuis l'un de ses événements : pendant un appel synchrone ses événements continuent d'arriver, et un
destroydans l'un d'eux laisse l'appel reprendre sur un objet détruit.of_closesuffit. - Une source refusée d'emblée n'est pas un événement :
-5etof_get_last_error(), tout de suite ; seule la file la signale parue_failed, à son tour.