
=head1 NOM

Win32::Sound - Une extension pour jouer avec les sons sous Windows

=head1 SYNOPSIS

    use Win32::Sound;
    Win32::Sound::Volume('100%');
    Win32::Sound::Play("file.wav");
    Win32::Sound::Stop();

    # ...et lisez la suite pour plus d'amusement ;-)

=head1 FONCTIONS

=over 4

=item B<Win32::Sound::Play(SOUND, [FLAGS])>

Joue le son spécifié : SOUND peut être le nom d'un fichier WAV ou l'un
des noms de sons prédéfinis suivants :

    SystemDefault
    SystemAsterisk
    SystemExclamation
    SystemExit
    SystemHand
    SystemQuestion
    SystemStart

En outre, si le son nommé n'est pas trouvé, la fonction joue le
son système par défaut (à moins que ne vous spécifiiez le drapeau
C<SND_NODEFAULT>). Si aucun paramètre n'est donné, cette fonction
arrête le son qui joue actuellement (voyez aussi Win32::Sound::Stop).

FLAGS peut être une combinaison des constantes suivantes :

=over 4

=item C<SND_ASYNC>

Le son est joué de manière asynchrone et la fonction revient immédiatement
après avoir commencé à émettre le son (si ce drapeau n'est pas spécifié, le
son est joué de façon synchrone et la fonction revient quand le son est
terminé).

=item C<SND_LOOP>

Le son est joué de manière répétitive jusqu'à ce qu'il soit arrêté.
Vous devez spécifier aussi le drapeau C<SND_ASYNC>.

=item C<SND_NODEFAULT>

Aucun son par défaut n'est utilisé. Si le son spécifié C<SOUND> ne peut
être trouvé, la fonction retourne sans rien jouer.

=item C<SND_NOSTOP>

Si un son joue déjà, la fonction échoue. Par défaut, tout nouvel appel à
la fonction arrêtera les sons jouant précédemment.

=back

=item B<Win32::Sound::Stop()>

Arrête le son qui joue actuellement.

=item B<Win32::Sound::Volume()>

Retourne le volume sonore du dispositif I<wave>; si appelée dans un contexte
de liste, retourne les valeurs gauche et droite. Sinon, retourne une seule
valeur 32 bits (gauche dans l'octet de poids faible, droite dans celui de
poids fort). En cas d'erreur, retourne C<undef> et fixe $!.

Exemples:

    ($L, $R) = Win32::Sound::Volume();
    if( not defined Win32::Sound::Volume() ) {
        die "Imposible d'obtenir le volume: $!";
    }

=item B<Win32::Sound::Volume(GAUCHE, [DROITE])>

Fixe le volume du dispositif I<wave>; si deux arguments sont donnés,
fixe les volumes des canaux de gauche et droite indépendamment, sinon met
les deux canaux à la valeur du canal GAUCHE (c-à-d DROITE=GAUCHE).
La gamme des valeurs va de 0 à 65535 (0xFFFF), mais elles peuvent aussi être
données en pourcentage (utilisez une chaîne contenant un nombre suivi du
signe pour cent %).

Retourne C<undef> et fixe la valeur de $! en cas d'erreur, donne
une valeur VRAI en cas de succès.

Exemples:

    Win32::Sound::Volume('50%');
    Win32::Sound::Volume(0xFFFF, 0x7FFF);
    Win32::Sound::Volume('100%', '50%');
    Win32::Sound::Volume(0);

=item B<Win32::Sound::Format(nomfichier)>

Retourne un tableau d'informations à propos du fichier au format WAV spécifié;
Le tableau contient :

=over

=item * la fréquence d'échantillonnage (en Hz)

=item * le nombre de bits par échantillon (8 ou 16)

=item * nombre de canaux (1 pour mono, 2 pour stéréo)

=back

Exemple:

    ($hz, $bits, $channels)
        = Win32::Sound::Format("file.wav");


=item B<Win32::Sound::Devices()>

Retourne tous les dispositifs sonores disponibles;
leurs noms sont formés du type du dispositif (WAVEOUT, WAVEIN, MIDIOUT,
MIDIIN, AUX ou MIXER) et d'un identificateur numérique (à partir de zéro);
des noms valides de dispositifs sont, par exemple :

    WAVEOUT0
    WAVEOUT1
    WAVEIN0
    MIDIOUT0
    MIDIIN0
    AUX0
    AUX1
    AUX2

Il y a aussi deux noms de dispositifs particuliers, C<WAVE_MAPPER>
et C<MIDI_MAPPER> (les dispositifs par défaut pour les sorties I<wave>
et les sorties I<midi>).

Exemple:

    @devices = Win32::Sound::Devices();

=item Win32::Sound::DeviceInfo(DEVICE)

Retourne un tableau associatif d'informations sur le dispositif
son nommé DEVICE (sous le même format que Win32::Sound::Devices).

Le contenu du tableau dépend du type de dispositif interrogé.
Tout dispositif doit B<au moins> retourner les informations suivantes :

    manufacturer_id
    product_id
    name
    driver_version

Pour les données supplémentaires, référez-vous à la table suivante:

    WAVEIN..... formats
                channels

    WAVEOUT.... formats
                channels
                support

    MIDIOUT.... technology
                voices
                notes
                channels
                support

    AUX........ technology
                support

    MIXER...... destinations
                support

Les significations des champs qui ne sont pas évidentes peuvent être trouvées
dans la documentation Microsoft du SDK (trop long à rapporter ici, un jour
peut-être...:-).

Exemple:

    %info = Win32::Sound::DeviceInfo('WAVE_MAPPER');
    print "$info{name} version $info{driver_version}\n";

=back

=head1 LE PAQUETAGE WaveOut

Win32::Sound fournit aussi une approche différente, plus puissante,
pour produire des données audio avec son paquetage C<WaveOut>.
Il a des méthodes pour charger et pour jouer des fichiers WAV,
avec la possibilité additionnelle de spécifier le début et la fin de
gamme, donc vous pouvez jouer seulement une portion d'un fichier sonore.

En outre, il est possible de charger des données binaires arbitraires
dans la carte son pour les faire jouer et pour les sauvegarder dans
des fichiers WAV; autrement dit, vous pouvez faire un peu de synthèse sonore.

=head2 FONCTIONS

=over

=item new Win32::Sound::WaveOut(FILENAME)

=item new Win32::Sound::WaveOut(SAMPLERATE, BITS, CHANNELS)

=item new Win32::Sound::WaveOut()

Cette fonction crée un objet C<WaveOut>; la première forme
ouvre le fichier I<wave> spécifié (voir aussi C<Open()> ), donc
vous pouvez directement le jouer avec C<Play()>.

La deuxième (et la troisièmement) forme ouvre le dispositif I<wave> de sortie
avec le format donné (ou, si aucun n'est donné, avec les valeurs par défaut
44.1kHz, 16 bits, stéréo); pour produire quelque chose d'audible, vous pouvez
soit ouvrir un fichier I<wave> avec C<Open()> ou bien charger un fichier de données
binaires dans la carte son avec C<Load()> et les sauvegarder avec C<Write()>.

=item Close()

Ferme le fichier I<wave> ouvert courant.

=item CloseDevice()

Ferme le dispositif I<wave> de sortie; vous pouvez changer de format
et le rouvrir avec C<OpenDevice()>.

=item GetErrorText(ERROR)

Retourne le texte d'erreur associé au numéro d'erreur spécifié;
notez que cette fonction ne marche que pour les erreurs de sortie
I<wave>.

=item Load(DATA)

Charges les données DATA dans le tampon de la carte son. Le format
des données du tampon dépend du format utilisé; par exemple, avec 8 bits mono
chaque échantillon est d'un seul caractère, alors qu'avec 16 bits stéréo chaque
échantillon est de quatre caractères (deux valeurs 16 bits pour les canaux
gauche et droit). Le taux d'échantillonnage définit combien d'échantillons
sont pris en une seconde de son. Par exemple, pour contenir une seconde
de son à 44.1kHz 16 bits stéréo, votre tampon doit contenir 176400 octets
(44100 * 4).

=item Open(FILE)

Ouvre le fichier I<wave> spécifié.

=item OpenDevice()

Ouvre le dispositif I<wave> de sortie avec le format son courant.
(non nécessaire, à moins que vous n'ayez utilisé C<CloseDevice()>).


=item Pause()

Fait une pause pour le son en train de jouer;
utilisez C<Restart()> pour reprendre.

=item Play( [FROM, TO] )

Joue le fichier I<wave> ouvert. Vous pouvez spécifier facultativement une
gamme FROM - TO, où FROM et TO sont exprimés en échantillons (ou utiliser
FROM=0 pour le premier échantillon et TO=-1 pour le dernier échantillon).
Les playbacks se produisent toujours de manière asynchrone, par exemple
en arrière-fond.

=item Position()

Retourne le numéro de l'échantillon en train de jouer.
Notez que la position n'est pas remise à zéro quand le son se termine,
donc vous devez appeler la fonction C<Reset()> entre deux jeux pour
recevoir la position courante dans le jeu courant.

=item Reset()

Arrête de jouer le son et réinitialise la position du jeu.
(voir C<Position()>).

=item Restart()

Continue de jouer le son interrompu par C<Pause()>.

=item Save(FILE, [DATA])

Écrit le tampon DATA (s'il n'est pas donné, utilise le tampon
courant chargé dans la carte son) dans le fichier I<wave> FILE.

=item Status()

Retourne 0 si la carte son est en train de jouer, 1 si elle est
libre, ou C<undef> en cas d'erreur.

=item Unload()

Libère la carte son des données chargées.

=item Volume( [LEFT, RIGHT] )

Donne ou fixe le volume du dispositif I<wave>.
Fonctionne de la même manière que Win32::Sound::Volume.

=item Write()

Joue les données chargées dans la carte son;
Les playbacks se produisent toujours de manière asynchrone, par exemple
en arrière-fond.

=back

=head2 LE FORMAT SON

Le format son est stocké dans trois propriétés de l'objet C<WaveOut> :
C<samplerate>, C<bits> et C<channels>.
Si vous voulez les changer sans créer un nouvel objet, vous devez d'abord
fermer le dispositif et le rouvrir après.

    $WAV->CloseDevice();
    $WAV->{samplerate} = 44100; # 44.1kHz
    $WAV->{bits}       = 8;     # 8 bit
    $WAV->{channels}   = 1;     # mono
    $WAV->OpenDevice();

Vous pouvez aussi utiliser ces propriétés pour obtenir le format son
couramment utilisé.

=head2 EXEMPLE

Ce petit exemple produit un son sinusoïdal à 440Hz de 1 seconde
et le sauve dans F<sinus.wav>  :

    use Win32::Sound;

    # Création de l'objet
    $WAV = new Win32::Sound::WaveOut(44100, 8, 2);

    $data = "";
    $counter = 0;
    $increment = 440/44100;

    # Génère 44100 échantillons ( = 1 seconde)
    for $i (1..44100) {

        # Calcule le ton
        # (gamme 0..255 pour 8 bits)
        $v = sin($counter/2*3.14) * 128 + 128;

        # "pack" deux fois pour gauche et droit
        $data .= pack("cc", $v, $v);

        $counter += $increment;
    }

    $WAV->Load($data);       # charger
    $WAV->Write();           # écouter
    1 until $WAV->Status();  # attendre la fin
    $WAV->Save("sinus.wav"); # écrire sur le disque
    $WAV->Unload();          # laisser tomber

=head1 VERSION

Win32::Sound version 0.46, 25 Sep 1999.

=head1 AUTEUR

Aldo Calpini, <dada@divinf.it>

Des parties de code ont été fournies et/ou ont été suggérées par Dave Roth.

=head1 VERSION FRANÇAISE

Cette traduction française correspond à la version anglaise distribuée avec perl 5.6.1.
Pour en savoir plus concernant ces traductions, consultez http://www.enstimac.fr/Perl/ .

=head1 TRADUCTION EN FRANÇAIS

Jean-Louis Morel <jl_morel@bribes.org>

=cut



