LA CLOCHE

Il y a ceux qui ont lu cette nouvelle avant vous.
Abonnez-vous pour recevoir les derniers articles.
Email
Nom
Nom de famille
Comment voulez-vous lire The Bell
Pas de spam

Sujet: Comment faire chanter une application Delphi 2.

Cette astuce montre quatre différentes façons comment faire chanter votre application Delphi 2.0, i.e. télécharger et lire le fichier son:

1. Pour lire un fichier son, utilisez directement la fonction sndPlaySound ().

2. Lisez le fichier son en mémoire, puis utilisez sndPlaySound () pour le lire.

3. Utilisez sndPlaySound pour lire directement les fichiers audio situés dans les fichiers de ressources liés à votre application.

4. Lisez le fichier audio situé dans le fichier de ressources lié à votre application en mémoire, puis utilisez sndPlaySound () pour le lire.

Pour construire un projet dont vous avez besoin:

1. Créez un fichier son nommé "hello.wav" dans le répertoire de votre projet.

2. Créez fichier texte nommé "snddata.rc" dans le répertoire du projet.

3. Ajoutez la ligne suivante au fichier "snddata.rc":

.

4. Dans une session DOS, accédez au répertoire de votre application et compilez le fichier .rc à l'aide du Borland Resource Compiler (brcc32.exe): entrez le chemin d'accès à brcc32.exe et transmettez "snddata.rc" comme paramètre.

Cela créera un fichier appelé "snddata.res" que Delphi reliera au fichier EXE de votre application.


les usagesWindows, Messages, SysUtils, Classes, Graphiques, Contrôles, Formulaires, Dialogues, StdCtrls;

typeTForm1 \u003d classe(TForm)
procédure PlaySndFromFileClick (Sender: TObject);
procédure PlaySndFromMemoryClick (Sender: TObject);
procédure PlaySndFromResClick (Sender: TObject);
procédure PlaySndbyLoadResClick (Sender: TObject);



procédure TForm1.PlaySndFromFileClick (Expéditeur: TObject);
sndPlaySound ("bonjour.wav", SND_FILENAME ou SND_SYNC);

procédure TForm1.PlaySndFromMemoryClick (Expéditeur: TObject);
sndPlaySound (p, SND_MEMORY ou SND_SYNC);

procédure TForm1.PlaySndFromResClick (Expéditeur: TObject);
PlaySound ("HELLO", hInstance, SND_RESOURCE ou SND_SYNC);

procédure TForm1.PlaySndbyLoadResClick (Expéditeur: TObject);
h: \u003d FindResource (hInstance, "HELLO", "WAVE");
h: \u003d LoadResource (hInstance, h);
sndPlaySound (p, SND_MEMORY ou snd_sync);

Créer un nouveau fichier .wav

Sujet: Créez un nouveau fichier .wav.

Ce document a été créé en réponse à de nombreuses demandes d'utilisateurs et décrit les fonctionnalités supplémentaires du composant Delphi TMediaPlayer. La nouvelle fonctionnalité du composant est la possibilité de créer un nouveau fichier .wav lors de l'enregistrement. La procédure SaveMedia crée un type d'enregistrement passé à la commande MCISend. Il existe une exception qui entraîne la fermeture du support en cas d'erreur survenant lors de l'ouverture d'un fichier spécifique. L'application se compose de deux boutons. Button1 appelle les procédures OpenMedia et RecordMedia dans l'ordre. CloseMedia est appelé lorsque l'application lève une exception. Button2 appelle les procédures StopMedia, SaveMedia et CloseMedia.


les usagesWindows, Messages, SysUtils, Classes, Graphiques, Contrôles, Formulaires, Dialogues, MPlayer, MMSystem, StdCtrls;

typeTForm1 \u003d classe(TForm)
procédure
procédure Button2Click (Expéditeur: TObject);
procédure
procédure AppException (expéditeur: TObject; E: Exception);
procédure RecordMedia;
procédure CloseMedia;


varMyError, Flags: Longint;

procédure TForm1.OpenMedia;
MyOpenParms: TMCI_Open_Parms;
Drapeaux: \u003d mci_Wait ou mci_Open_Element ou mci_Open_Type;
avec MyOpenParms commencez
lpstrDeviceType: \u003d PChar ("WaveAudio");
MyError: \u003d mciSendCommand (0, mci_Open, Flags, Longint (@MyOpenParms));
si MyError \u003d 0 puisFDeviceID: \u003d MyOpenParms.wDeviceID;

procédure TForm1.RecordMedia;
MyRecordParms: TMCI_Record_Parms;
avec MyRecordParms commencez
dwCallback: \u003d Handle; // TForm1.Handle
MyError: \u003d mciSendCommand (FDeviceID, mci_Record, Flags, Longint (@MyRecordParms));

procédure TForm1.StopMedia;
var
si FDeviceID<> 0 alors commencez
MyError: \u003d mciSendCommand (FDeviceID, mci_Stop, Flags, Longint (@MyGenParms));

procédure TForm1.SaveMedia;
type // non implémenté dans Delphi
PMCI_Save_Parms \u003d ^ TMCI_Save_Parms;
TMCI_Save_Parms \u003d record
lpstrFileName: PAnsiChar; // nom du fichier à enregistrer
varMySaveParms: TMCI_Save_Parms;
si FDeviceID<> 0 alors commencez
// enregistre le fichier ...
Indicateurs: \u003d mci_Save_File ou mci_Wait;
avec MySaveParms commencez
lpstrFileName: \u003d PChar ("c: \\ message.wav");
MyError: \u003d mciSendCommand (FDeviceID, mci_Save, Flags, Longint (@MySaveParms));

procédure TForm1.CloseMedia;
varMyGenParms: TMCI_Generic_Parms;
si FDeviceID<> 0 alors commencez
MyGenParms.dwCallback: \u003d Handle; // TForm1.Handle
MyError: \u003d mciSendCommand (FDeviceID, mci_Close, Flags, Longint (@MyGenParms));
si MyError \u003d 0 puisFDeviceID: \u003d 0;

procédure

procédure TForm1.Button2Click (Expéditeur: TObject);

procédure
Application.OnException: \u003d AppException;

procédure TForm1.AppException (Expéditeur: TObject; E: Exception);

Comment mettre en place un contrôle de volume?

Nomadic conseille:

Oui, tout est simple. Même, je dirais, tupo. :-)

INT GetMasterVolumeControlID () (
mxl.cbStruct \u003d sizeof (MIXERLINE);
mxl.dwComponentType \u003d MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
if (:: mixerGetLineInfo ((HMIXEROBJ) ghmx, & mxl, MIXER_OBJECTF_HMIXER | MIXER_GETLINEINFOF_COMPONENTTYPE)! \u003d MMSYSERR_NOERROR) return 34;
mxlc.cbStruct \u003d sizeof (MIXERLINECONTROLS);
mxlc.dwLineID \u003d mxl.dwLineID;
mxlc.dwControlType \u003d MIXERCONTROL_CONTROLTYPE_VOLUME;
mxlc.cbmxctrl \u003d sizeof (MIXERCONTROL);
if (:: mixerGetLineControls ((HMIXEROBJ) ghmx, & mxlc, MIXER_OBJECTF_HMIXER | MIXER_GETLINECONTROLSF_ONEBYTYPE)! \u003d MMSYSERR_NOERROR) return 34;

BOOL SetMasterVolume (DWORD dwVolume) (
MIXERCONTROLDETAILS_UNSIGNED mxcd_u;
mxcd.cbStruct \u003d taille de (mxcd);
mxcd.dwControlID \u003d MasterVolumeControlID;
mmr \u003d mixerGetControlDetails ((HMIXEROBJ) ghmx, & mxcd, 0L);
mmr \u003d mixerSetControlDetails ((HMIXEROBJ) ghmx, & mxcd, 0L);
if (MMSYSERR_NOERROR! \u003d mmr) return FALSE;

Je pense qu'il n'est pas nécessaire de réécrire dans Delphi. Vous devez juste vous rappeler d'ajouter des utilisations MMSystem; Le volume des canaux individuels est très facile à régler via auxSetVolume et similaire.

Comment utiliser les API DirectSound et DirectSound3D dans mon programme?


Nomadic conseille:

Exemple 1

Je présente à votre attention un exemple de travail d'utilisation de DirectSound dans Delphi + plusieurs procédures utiles. Cet exemple crée un SoundBuffer principal et 2 secondaires statiques; 2 fichiers WAV y sont chargés. Le tampon principal est créé par la procédure AppCreateWritePrimaryBuffer et tout tampon secondaire est créé par AppCreateWritePrimaryBuffer. Le tampon secondaire étant associé à un fichier WAV, lors de la création d'un tampon, vous devez définir ses paramètres en fonction du fichier son, ces caractéristiques (Samples, Bits, IsStereo) sont spécifiées comme paramètres de procédure. Heure - l'heure du fichier WAV en secondes (arrondi). Appuyez sur le bouton pour mélanger les tampons secondaires vers les tampons primaires. AppWriteDataToBuffer vous permet d'écrire un signal PCM dans le tampon. La procédure CopyWAVToBuffer ouvre un fichier WAV, sépare l'en-tête, lit le bloc de données et le copie dans le tampon (dans ce cas, la taille des données est lue en premier, car certains fichiers WAV ont une annexe texte, et si vous ne la supprimez pas, des grésillements sont possibles dans les haut-parleurs).

PS. Si vous avez des questions, j'essaierai d'y répondre.



les usages

typeTForm1 \u003d classe(TForm)
procédure FormCreate (Sender: TObject);
procédure
procédure Button1Click (Expéditeur: TObject);
Secondaire SoundBuffer: tableau de IDirectSoundBuffer;
procédure
procédure AppCreateWriteSecondaryBuffer ( var
procédure var
procédure CopyWAVToBuffer (Nom: PChar;
var


procédure TForm1.FormCreate (Expéditeur: TObject);
siDirectSoundCreate ( néant, Son direct, néant) <> DS_OK puis élever
AppCreateWriteSecondaryBuffer (SecondarySoundBuffer, 22050, 8, False, 10);
AppCreateWriteSecondaryBuffer (SecondarySoundBuffer, 22050, 16, True, 1);

procédure
siAttribué (DirectSoundBuffer) puis DirectSoundBuffer.Release;
pour i: \u003d 0 à 1 faire si Attribué (SecondarySoundBuffer [i]) puis SecondaireSoundBuffer [i] .Release;
si Attribué (DirectSound) puis DirectSound.Release;

procédure
H: \u003d;
si H \u003d DSERR_BUFFERLOST alors commencez
si Buffer.Lock (OffSet, SoundBytes, AudioPtr1, AudioBytes1, AudioPtr2, AudioBytes2, 0)<> DS_OK puis élever
sinon si H<> DS_OK puis élever Exception.Create ("Impossible de verrouiller le tampon audio");
si AudioPtr2<> nil puis commencer
si <> DS_OK puis élever

procédure
avec BufferDesc commencez
si <> DS_OK puis élever
si néant) <> DS_OK puis élever
si <> DS_OK puis élever
si DirectSound.SetCooperativeLevel (Handle, DSSCL_NORMAL)<> DS_OK puis élever Exception.Create ("Impossible de définir le niveau de coopération");

procédure TForm1.AppCreateWriteSecondaryBuffer;
FillChar (BufferDesc, SizeOf (DSBUFFERDESC), 0);
FillChar (PCM, SizeOf (TWaveFormatEx), 0);
avec BufferDesc commencez
PCM.wFormatTag: \u003d WAVE_FORMAT_PCM;
si isStereo puis PCM.nChannels: \u003d 2
autre PCM.nChannels: \u003d 1;
PCM.nBlockAlign: \u003d (Bits div 8) * PCM.nChannels;
PCM.nAvgBytesPerSec: \u003d PCM.nSamplesPerSec * PCM.nBlockAlign;
dwSize: \u003d SizeOf (DSBUFFERDESC);
si néant) <> DS_OK puis élever Exception.Create ("La création du tampon audio a échoué");

procédure TForm1.CopyWAVToBuffer;
jusqu'à ce que Chunk \u003d "données";

procédure TForm1.Button1Click (Expéditeur: TObject);
CopyWAVToBuffer ("1.wav", SecondarySoundBuffer);
CopyWAVToBuffer ("flip.wav", SecondarySoundBuffer);
si <> DS_OK puis
si SecondarySoundBuffer.Play (0, 0, 0)<> DS_OK puis ShowMessage ("Impossible" "de jouer le son");
Exemple 2

Je présente à votre attention un autre exemple de travail avec DirectSound dans Delphi. Cet exemple montre comment travailler avec un tampon 3D. Donc, j'ai laissé les procédures AppCreateWritePrimaryBuffer, AppWriteDataToBuffer, CopyWAVToBuffer inchangées (voir les lettres d'avant). La procédure AppCreateWriteSecondary3DBuffer est exactement la même que la procédure AppCreateWriteSecondaryBuffer, à l'exception de l'indicateur DSBCAPS_CTRL3D, qui indique qu'un autre tampon, SecondarySound3DBuffer, sera associé au backbuffer statique. Pour l'initialiser et installer également valeurs initiales (position dans l'espace, vitesse, etc.), la procédure AppSetSecondary3DBuffer est appelée, dont les paramètres sont transmis au SecondarySoundBuffer lui-même et au SecondarySound3DBuffer qui lui est associé. Dans cette procédure, le SecondarySound3DBuffer est initialisé à l'aide de la méthode QueryInterface avec l'indicateur approprié. De plus, la position de la source sonore dans l'espace est également définie ici: SetPosition (Pos, 1 (X), 1 (Y), 0 (Z)).

Ainsi, à l'instant initial, la source est à une hauteur de 1 m (l'axe Y est dirigé verticalement vers le haut, et l'axe Z est dirigé "dans l'écran"). Vue d'en haut:

Le point O (en fait vous) a les coordonnées (0,0), la source sonore A (-25,1). Bien entendu, le concept de «mètre» est très conditionnel.

Lorsque le bouton est enfoncé, le son "xhe4.wav" est chargé dans le SecondarySoundBuffer. C'est le son d'un rotor d'hélicoptère en marche, sa longueur (son) est exactement de 3,99 s (et la taille du tampon est exactement de 4 s). Ensuite, il y a un mixage du tampon secondaire vers le tampon primaire avec le drapeau DSBPLAY_LOOPING, qui vous permet de faire un son répétitif; le temps à 0,01 avec l'oreille n'est pratiquement pas capté et un son continu d'un hélicoptère volant est obtenu. Après cela, le minuteur démarre (le champ INTERVAL dans l'inspecteur d'objets est défini sur 1). Bien sûr, vous n'avez pas du tout à faire cela, ce n'est qu'un exemple. La routine Timer1Timer change simplement la coordonnée X par incréments de 0,1.

En conséquence, nous obtenons un hélicoptère volant de gauche à droite. En même temps, vous pouvez vérifier si vos colonnes sont correctement positionnées.

PS. Si vous avez des questions, j'essaierai d'y répondre.



les usagesWindows, Messages, SysUtils, Classes, Graphiques, Contrôles, Formulaires, Dialogues, DSound, MMSystem, StdCtrls, ExtCtrls;

typeTForm1 \u003d classe(TForm)
procédure FormCreate (Sender: TObject);
procédure FormDestroy (Sender: TObject);
procédure Button1Click (Expéditeur: TObject);
procédure Timer1Timer (expéditeur: TObject);
DirectSoundBuffer: IDirectSoundBuffer;
SecondarySoundBuffer: IDirectSoundBuffer;
SecondarySound3DBuffer: IDirectSound3DBuffer;
procédure AppCreateWritePrimaryBuffer;
procédure AppCreateWriteSecondary3DBuffer ( var Tampon: IDirectSoundBuffer; SamplesPerSec: Entier; Bits: Word; isStereo: Booléen; Heure: Entier);
procédure AppSetSecondary3DBuffer ( var Tampon: IDirectSoundBuffer; var _3DBuffer: IDirectSound3DBuffer);
procédure AppWriteDataToBuffer (Buffer: IDirectSoundBuffer; OffSet: DWord; var SoundData; SoundBytes: DWord);
procédure CopyWAVToBuffer (Nom: PChar; var Tampon: IDirectSoundBuffer);


procédure TForm1.FormCreate (Expéditeur: TObject);
siDirectSoundCreate ( néant, Son direct, néant) <> DS_OK puis élever Exception.Create ("Impossible de créer l'objet IDirectSound");
AppCreateWriteSecondary3DBuffer (SecondarySoundBuffer, 22050, 8, False, 4);
AppSetSecondary3DBuffer (SecondarySoundBuffer, SecondarySound3DBuffer); Timer1.Enabled: \u003d False;

procédure TForm1.FormDestroy (Expéditeur: TObject);
siAttribué (DirectSoundBuffer) puis DirectSoundBuffer.Release;
si Attribué (SecondarySound3DBuffer) puis SecondarySound3DBuffer.Release;
si Attribué (SecondarySoundBuffer) puis SecondarySoundBuffer.Release;
si Attribué (DirectSound) puis DirectSound.Release;

procédure TForm1.AppCreateWritePrimaryBuffer;
FillChar (BufferDesc, SizeOf (DSBUFFERDESC), 0);
FillChar (PCM, SizeOf (TWaveFormatEx), 0);
avec BufferDesc commencez
PCM.wFormatTag: \u003d WAVE_FORMAT_PCM;
PCM.nAvgBytesPerSec: \u003d PCM.nSamplesPerSec * PCM.nBlockAlign;
dwSize: \u003d SizeOf (DSBUFFERDESC);
dwFlags: \u003d DSBCAPS_PRIMARYBUFFER;
si DirectSound.SetCooperativeLevel (Handle, DSSCL_WRITEPRIMARY)<> DS_OK puis élever
si DirectSound.CreateSoundBuffer (BufferDesc, DirectSoundBuffer, néant) <> DS_OK puis élever Exception.Create ("La création du tampon audio a échoué");
si DirectSoundBuffer.SetFormat (PCM)<> DS_OK puis élever Exception.Create ("Impossible de définir le format");
si DirectSound.SetCooperativeLevel (Handle, DSSCL_NORMAL)<> DS_OK puis élever Exception.Create ("Impossible de définir le niveau coopératif");

procédure TForm1.AppCreateWriteSecondary3DBuffer;
FillChar (BufferDesc, SizeOf (DSBUFFERDESC), 0);
FillChar (PCM, SizeOf (TWaveFormatEx), 0);
avec BufferDesc commencez
PCM.wFormatTag: \u003d WAVE_FORMAT_PCM;
si isStereo puis PCM.nChannels: \u003d 2
autre PCM.nChannels: \u003d 1;
PCM.nSamplesPerSec: \u003d SamplesPerSec;
PCM.nBlockAlign: \u003d (Bits div 8) * PCM.nChannels;
PCM.nAvgBytesPerSec: \u003d PCM.nSamplesPerSec * PCM.nBlockAlign;
dwSize: \u003d SizeOf (DSBUFFERDESC);
dwFlags: \u003d DSBCAPS_STATIC ou DSBCAPS_CTRL3D;
dwBufferBytes: \u003d Heure * PCM.nAvgBytesPerSec;
si DirectSound.CreateSoundBuffer (BufferDesc, Buffer, néant) <> DS_OK puis élever Exception.Create ("La création du tampon audio a échoué");

procédure TForm1.AppWriteDataToBuffer;
AudioPtr1, AudioPtr2: pointeur;
AudioBytes1, AudioBytes2: DWord;
si H \u003d DSERR_BUFFERLOST alors commencez
si Buffer.Lock (OffSet, SoundBytes, AudioPtr1, AudioBytes1, AudioPtr2, AudioBytes2, 0)<> DS_OK puis élever Exception.Create ("Impossible de verrouiller le tampon audio");
sinon si H<> DS_OK puis élever Exception.Create ("Impossible de verrouiller le tampon audio");
Déplacer (Temp ^, AudioPtr1 ^, AudioBytes1);
si AudioPtr2<> nil puis commencer
Inc (Entier (Temp), AudioBytes1);
Déplacer (Temp ^, AudioPtr2 ^, AudioBytes2);
si Buffer.UnLock (AudioPtr1, AudioBytes1, AudioPtr2, AudioBytes2)<> DS_OK puis élever Exception.Create ("Impossible de déverrouiller le tampon audio");

procédure TForm1.CopyWAVToBuffer;
FName: \u003d TFileStream.Create (Nom, fmOpenRead);
FName.Seek (Pos, soFromBeginning);
jusqu'à ce que Chunk \u003d "données";
FName.Seek (Pos + 3, soFromBeginning);
FName.Read (DataSize, SizeOf (DWord));
AppWriteDataToBuffer (Buffer, 0, Data ^, DataSize);

var Pos: Unique \u003d -25;

procédure TForm1.AppSetSecondary3DBuffer;
siBuffer.QueryInterface (IID_IDirectSound3DBuffer, _3DBuffer)<> DS_OK puis élever Exception.Create ("Impossible de créer l'objet IDirectSound3D");
si _3DBuffer.SetPosition (Pos, 1, 1, 0)<> DS_OK puis élever Exception.Create ("Impossible de définir la position IDirectSound3D");

procédure TForm1.Button1Click (Expéditeur: TObject);
CopyWAVToBuffer ("xhe4.wav", SecondarySoundBuffer);
si SecondarySoundBuffer.Play (0, 0, DSBPLAY_LOOPING)<> DS_OK puis ShowMessage ("Impossible" "de jouer le son");

procédure TForm1.Timer1Timer (expéditeur: TObject);
SecondarySound3DBuffer.SetPosition (Pos, 1,1,0);

Dans cet article, je vais essayer de couvrir trois procédures pour jouer du son. L'utilisation de ces procédures au lieu du composant TMediaPlayer économisera considérablement les ressources système. Un éventail assez large de tâches peut être résolu en utilisant ces procédures. Alors, commençons à considérer ces procédures avec la plus simple.

Procédure de bip

Cette procédure n'a pas de paramètres. Sa déclaration semble assez simple:

L'essence de cette procédure est de reproduire la norme signal sonoreinstallé sur Windows, si disponible carte son et le son standard est défini, sinon, le son passera par le haut-parleur de l'ordinateur sous la forme d'un clic court. Il peut être utilisé, par exemple, lorsque l'utilisateur saisit des données erronées, ou lorsque le formulaire est fermé:

procedure TForm1.FormClose (Sender: TObject; var Action: TCloseAction);
commencer
Bip;
fin;

Nous avons compris la première procédure. Voyons maintenant le deuxième ...

Fonction MessageBeep

Cette fonction est plus sérieuse, elle se définit comme:

function MessageBeep (uType: mot): booléen;

Le paramètre uType spécifie le son en cours de lecture, en tant qu'identifiant de la clé de registre dans laquelle sont enregistrés les sons accompagnant certains événements Windows. Le paramètre uType peut prendre les valeurs suivantes:

  • MB_ICONASTERISK - joue le son "Asterisk" (SystemAsterisk)
  • MB_ICONEXCLAMATION - lit le son "Exclamation" (SystemExclamation)
  • MB_ICONHAND - lit le son "Erreur critique" (SystemHand)
  • MB_ICONQUESTION - joue le son "Question" (SystemQuestion)
  • MB_OK - joue le son "Son standard" (SystemDefault)

Il convient de noter que cette fonction joue le son de manière asynchrone, c'est-à-dire pendant la lecture du son, votre application continue de s’exécuter. Une fois le son demandé, la fonction MessageBeep passe le contrôle à la fonction appelante.

Si le son spécifié ne peut pas être lu, la fonction essaiera de lire le son standard. son système, réglé par défaut, si cela n'est pas possible, le signal standard sera lu par le haut-parleur.

Et enfin, le plus intéressant et fonction utile reproduction sonore, nous en parlerons maintenant.

Fonction PlaySound

Cette fonction peut lire tous les sons de forme d'onde, pas seulement les sons d'événements Windows. Fonction API Windows, dont les paramètres sont décrits dans le module mmsystem. Par conséquent, pour utiliser cette fonction dans vos programmes, vous devez inclure l'unité mmsystem dans la clause uses. La fonction PlaySound est définie comme ceci:

function PlaySound (pszSound: PChar; hmod: HINST; fdwSound: Cardinal): booléen;

Le paramètre pszSound est une chaîne terminée par null (le dernier caractère de la chaîne a un code nul), il définit le son à jouer. Le paramètre hmod est utilisé dans le cas où le son est extrait de la ressource, puisque nous ne le ferons pas, alors ce paramètre peut être mis à 0 ou nul.

Le dernier paramètre fdwSound est un ensemble qui détermine la manière dont le son sera joué (mode de lecture). Je vais donner les valeurs les plus importantes de cet ensemble pour reproduire des drapeaux d'onde arbitraires.

  • SND_ASYNC - Le son est lu de manière asynchrone et la fonction retourne dès qu'elle commence à jouer. Pour arrêter la lecture, appelez la fonction PlaySound avec le paramètre pszSound égal à 0.
  • SND_LOOP - la lecture du son est constamment répétée, en même temps le drapeau SND_ASYNC doit être défini.
  • SND_NOSTOP - Si le son spécifié ne peut pas être lu en raison de ressources occupées, la fonction retournera immédiatement false (et le son ne sera pas joué). Si cet indicateur n'est pas spécifié, la fonction essaiera d'arrêter de jouer un autre son pour libérer des ressources.
  • SND_PURGE - Arrête de jouer les sons déclenchés dans cette tâche.
  • SND_SYNC - Lecture synchrone du son d'événement. La fonction PlaySound ne revient qu'après la fin de la lecture.

Important: les drapeaux peuvent être combinés avec l'opération ou.

Le son spécifié par le paramètre pszSound doit être adapté à pilote installé périphérique de lecture de fichier wave et doit tenir dans la mémoire disponible.

Vous pouvez interrompre la lecture du son en exécutant l'opérateur

PlaySound (0, 0, SND_PURGE);

ou en définissant un nouveau son.

Par exemple, pour lire de manière répétée et asynchrone un son sélectionné avec OpenDialog, vous pouvez écrire un code comme celui-ci:

procedure TForm1.Button1Click (Sender: TObject);
var PCh: PChar;
commencer
si OpenDialog1.Exécutez alors
commencer
StrPCopy (PCh, OpenDialog1.FileName);
PlaySound (Pch, 0, SND_ASYNC ou SND_LOOP);
fin;
fin;

Eh bien, j'espère que tout est clair! La prochaine fois, il y aura quelque chose de plus compliqué et de plus intéressant!

Après avoir configuré les composants, définissez la taille du formulaire sur la taille du composant Image1 afin que les composants MediaPlayer1, SpeedButton5 et SpeedButton6 soient en dehors de la bordure du formulaire. En conséquence, le formulaire doit ressembler à celui illustré à la Fig. 10.17.

Figure: 10.17. La forme finale du programme "MP3-player"

Contrôle du volume

Vous pouvez utiliser l'API waveOutSetVolume pour régler le volume de lecture MP3 souhaité. Pour que cette fonction devienne disponible, un lien vers l'unité MMSystem doit être placé dans le texte du programme (spécifier le nom de l'unité dans la directive uses).

L'instruction d'appel de fonction en général ressemble à ceci:

r \u003d waveOutSetVolume (DeviceID, Volume)

Paramètre Reference de l'appareilrègle l'appareil de lecture (plus précisément le canal audio), dont le volume doit être réglé. Lors du réglage du volume de lecture d'un fichier MP3, la valeur de ce paramètre doit être égale à

WAVE_MAPPER (la constante WAVE_MAPPER est définie dans le module MMSystem).

Le paramètre Volume (double mot) règle le volume de lecture: le mot bas définit le volume du canal gauche, le mot haut détermine le volume de la droite. Le volume sonore maximal du canal correspond à valeur hexadécimale FFFF, le minimum est 0000. Ainsi, pour définir le volume de lecture maximum dans les deux canaux, la valeur du paramètre Volume doit être $ FFFFFFFF (dans Delphi, le préfixe $ est utilisé lors de l'écriture de constantes hexadécimales). La constante $ 7FFF7FFF correspond au niveau de volume de 50%.

Notez que la fonction waveOutSetVolume règle le volume de lecture canal audioplutôt que le niveau sonore global.

Le volume est modifié à l'aide du composant TrackBar1. Il est à noter que lorsque le composant est positionné verticalement, la position du haut du curseur correspond à la valeur zéro de la propriété Position, et celle du bas correspond à la valeur définie par la propriété Max. Par conséquent, le niveau de volume correspondant à la position du curseur est calculé comme la différence entre le courant et le maximum

la valeur la plus basse possible de la propriété Position (cette valeur spécifie la propriété Max), multipliée par $ FFFF.

Le changement de volume direct est effectué par la procédure de gestion de l'événement Change (Listing 10.14) du contrôle de volume (composant TrackBar1), qui se produit à la suite du déplacement du curseur avec la souris ou les touches de curseur. Tout d'abord, il calcule la valeur de volume pour le canal gauche, puis ajoute la même valeur décalée de 16 bits à la valeur obtenue (en conséquence, les mots haut et bas sont les mêmes valeurs), et la valeur obtenue de cette manière est passée en paramètre de fonction

waveOutSetVolume.

Annonce 10.14. Gestion de l'événement Change du composant TrackBar1

commencer

volume: \u003d $ FFFF * (TrackBar1.Max - TrackBar1.Position); volume: \u003d volume + (volume shl 16); waveOutSetVolume (WAVE_MAPPER, volume);

fin;

Déplacer la fenêtre

La valeur de la propriété BorderStyle du formulaire est égale à bsNone, donc le titre n'est pas affiché dans la fenêtre du programme (voir Fig.10.5), et par conséquent, à première vue, l'utilisateur semble être privé de la possibilité de déplacer la fenêtre autour de l'écran de sa manière habituelle. Néanmoins, la fenêtre du programme peut toujours être déplacée. Pour ce faire, placez le pointeur de la souris sur un point libre (non occupé par les composants) de la fenêtre, appuyez sur le bouton gauche de la souris et, en le maintenant enfoncé, faites glisser la fenêtre vers le point souhaité sur l'écran (cette méthode est très courante). La manière décrite pour déplacer la fenêtre est fournie par la procédure de gestion de l'événement MouseDown dans le champ du composant Image1 (Listing 10.15). La procédure "triche" système opérateur, l'informe (en envoyant un message approprié) que l'utilisateur a appuyé sur le bouton de la souris dans le titre de la fenêtre, c'est-à-dire qu'il a effectué une action qui nécessite de déplacer la fenêtre.

Listing 10.15. Gestion de l'événement MouseDown dans le champ du composant Image1

// Dans ce cas, l'utilisateur peut déplacer la fenêtre de la manière habituelle

SendMessage (Form1.Handle, WM_NCLBUTTONDOWN, HTCAPTION, 0) fin;

Texte du programme

Le programme complet du lecteur MP3 est présenté dans l'extrait 10.16.

Liste 10.16. Lecteur mp3

(Lecteur MP3 avec contrôle du volume.

(c) Kultin N.B., 2003-2010)

unit MainForm;

Windows, Messages, SysUtils, Variantes, Classes, Graphiques, Contrôles, Formulaires, Dialogues, StdCtrls, Buttons, ExtCtrls, MPlayer, ComCtrls, MMSYSTEM, FileCtrl, Menus; // ces liens sont insérés manuellement

TForm1 \u003d classe (TForm) MediaPlayer1: TMediaPlayer;

SpeedButton1: TSpeedButton; // composition précédenteSpeedButton2: TSpeedButton; // Lecture / Arrêt SpeedButton3: TSpeedButton; // composition suivanteSpeedButton4: TSpeedButton; // sélectionner le dossier

// boutons invisibles SpeedButton5 et SpeedButton6 fournissent

// stockage des images de lecture et d'arrêt

SpeedButton5: TSpeedButton;

SpeedButton6: TSpeedButton;

ListBox1: TListBox; // liste des pistes

Deuxieme PARTIE. Atelier de programmation

Label1: TLabel; // chanson en cours de lecture

Label2: TLabel; // récréation

Image1: TImage; // Contexte

PopupMenu1: TPopupMenu; // menu contextuel

N1: TMenuItem; // "Fermer"

N2: TMenuItem; // "Minimiser"

// contrôle du volume

Panel1: TPanel; // Panneau TrackBar1: TTrackBar;

procedure Image1MouseDown (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

procédure N2Click (Sender: TObject); procédure N1Click (Sender: TObject);

procedure FormCreate (Sender: TObject); procédure ListBox1Click (Sender: TObject); procédure SpeedButton2Click (Sender: TObject); procédure SpeedButton1Click (Sender: TObject); procédure SpeedButton3Click (Sender: TObject); procédure TrackBar1Change (Sender: TObject); procedure Timer1Timer (Sender: TObject); procédure SpeedButton4Click (Sender: TObject);

// ces déclarations sont insérées manuellement ici procédure Play; // jouer

procédure PlayList (Chemin: chaîne); // génère une liste de fichiers MP3

(Déclarations privées) public

(Déclarations publiques) fin;

($ R * .dfm) var

SoundPath: chaîne; // répertoire où se trouvent les fichiers MP3

min, sec: entier; // récréation

volume: LongWord; // volume de lecture:

// mot haut - canal droit,

// mot le moins significatif - gauche

procedure TForm1.FormCreate (Sender: TObject); commencer

Playlist (""); // génère une liste de fichiers MP3

ListBox1.ItemIndex: \u003d 0; Label1.Caption: \u003d ListBox1.Items;

// régler le niveau de volume

TrackBar1.Position: \u003d 7;

// le mot de poids fort de la variable de volume est le bon canal,

// junior est parti

volume: \u003d (TrackBar1.Position - TrackBar1.Max + 1) * $ FFFF; volume: \u003d volume + (volume shl 16); waveOutSetVolume (WAVE_MAPPER, volume); // niveau de volume

fin;

// génère une liste de fichiers MP3 procédure TForm1.PlayList (Path: string); var

SearchRec: TSearchRec; // la structure SearchRec contient des informations // sur le fichier qui correspond à la condition de recherche

// génère une liste de fichiers MP3

si FindFirst (Path + "* .mp3", faAnyFile, SearchRec) \u003d 0 alors commence

// Le répertoire contient un fichier avec l'extension mp3.

// Ajouter le nom de ce fichier à la liste

ListBox1.Items.Add (SearchRec.Name);

Deuxieme PARTIE. Atelier de programmation

// Y a-t-il plus de MP3?

while (FindNext (SearchRec) \u003d 0) do ListBox1.Items.Add (SearchRec.Name);

fin; ListBox1.ItemIndex: \u003d 0;

fin;

// cliquez sur le titre de la pièce

procedure TForm1.ListBox1Click (Sender: TObject); commencer

si SpeedButton2.Tag \u003d 0 alors

// affiche le nom du fichier sélectionné dans le champ Label1

Label1.Caption: \u003d ListBox1.Items else

Form1.Play; // activer le processus de lecture

fin;

// cliquez sur le bouton "Play"

procedure TForm1.SpeedButton2Click (Sender: TObject); commencer

// la propriété Tag stocke les informations d'état

// joueur: 0 - arrêt; 1 - lecture

si SpeedButton2.Tag \u003d 0 alors commencer // démarrer la lecture

Form1.Play; fin

// si le bouton Lecture est enfoncé,

// puis appuyer à nouveau arrête la lecturecommencer

SpeedButton2.Tag: \u003d 0; MediaPlayer1.Stop;

SpeedButton2.Glyph: \u003d SpeedButton5.Glyph; Timer1.Enabled: \u003d Faux; SPeedButton2.Hint: \u003d "Lire"; Label2.Caption: \u003d "0:00";

fin;

fin;

// bouton "Piste précédente"

procedure TForm1.SpeedButton1Click (Sender: TObject);

si ListBox1.ItemIndex\u003e 0 alors

ListBox1.ItemIndex: \u003d ListBox1.ItemIndex - 1; si SpeedButton2.Tag \u003d 1 alors

fin;

// bouton "Piste suivante"

procedure TForm1.SpeedButton3Click (Sender: TObject); commencer

si ListBox1.ItemIndex< ListBox1.Count then ListBox1.ItemIndex:= ListBox1.ItemIndex + 1;

si SpeedButton2.Tag \u003d 1 alors Play;

fin;

// l'utilisateur a changé la position de la procédure de contrôle du volume TForm1.TrackBar1Change (expéditeur: TObject);commencer

volume: \u003d $ FFFF * (TrackBar1.Max - TrackBar1.Position); volume: \u003d volume + (volume shl 16); waveOutSetVolume (WAVE_MAPPER, volume);

fin;

// joue la composition, dont le nom est mis en évidence dans la procédure de liste ListBox1 TForm1.Play;

Timer1.Enabled: \u003d Faux; Label1.Caption: \u003d ListBox1.Items; MediaPlayer1.FileName: \u003d SoundPath + ListBox1.Items;

Mediaplayer1.Open; sauf

sur EMCIDeviceError do begin

ShowMessage ("Erreur d'accès au fichier" + ListBox1.Items);

sortie; fin;

fin;

Deuxieme PARTIE. Atelier de programmation

MediaPlayer1.Play; min: \u003d 0;

sec: \u003d 0; Timer1.Enabled: \u003d Vrai;

SpeedButton2.Hint: \u003d "Arrêter"; SpeedButton2.Tag: \u003d 1;

fin;

// signal de minuterie

procedure TForm1.Timer1Timer (Sender: TObject); commencer

// changer le compteur de tempssi sec< 59

puis inc (sec) sinon commencer

sec: \u003d 0; inc (min);

fin;

// afficher le temps de lecture

Label2.Caption: \u003d IntToStr (min) + ":"; si sec< 10

puis Label2.Caption: \u003d Label2.Caption + "0" + IntToStr (sec) else Label2.Caption: \u003d Label2.Caption + IntToStr (sec);

// si la lecture du morceau en cours n'est pas terminée

si MediaPlayer1.Position< MediaPlayer1.Length then exit;

// la lecture de la chanson en cours est terminée

Timer1.Enabled: \u003d Faux; // arrêter la minuterieMediaPlayer1.Stop; // arrête le joueur

si ListBox1.ItemIndex< ListBox1.Count // la liste n'est pas épuiséealors commencez

ListBox1.ItemIndex: \u003d ListBox1.ItemIndex + 1; Jouer; // activer la lectureFin du fichier MP3

fin;

// Cliquez sur le bouton "Dossier".

// Sélectionnez le dossier contenant la procédure des fichiers MP3 TForm1.SpeedButton4Click (Expéditeur: TObject);var

Racine: chaîne; // répertoire racine pwRoot: PWideChar;

Dir: chaîne; commencer

Racine: \u003d ""; // répertoire racine - dossier Bureau

GetMem (pwRoot, (Longueur (racine) +1) * 2);

pwRoot: \u003d StringToWideChar (racine, pwRoot, MAX_PATH * 2);

sinon SelectDirectory ("Sélectionnez le dossier où se trouvent les fichiers MP3", pwRoot, Dir)

puis Dir: \u003d ""

else Dir: \u003d Dir + "\\";

// le répertoire où se trouvent les fichiers MP3 est sélectionné

SoundPath: \u003d Dir; PlayList (SoundPath);

fin;

// en cliquant sur le bouton de la souris dans le champ du composant Image1

procedure TForm1.Image1MouseDown (Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

// Il n'y a pas de titre à la fenêtre. Tromper Windows. Laissez le CO réfléchir

// que le bouton est enfoncé et maintenu dans la barre de titre de la fenêtre.

// Dans ce cas, l'utilisateur peut déplacer la fenêtre de la manière habituelle

SendMessage (Form1.Handle, WM_NCLBUTTONDOWN, HTCAPTION, 0)

fin;

// sélectionnez la commande "Fermer" dans menu contextuel procédure TForm1.N1Click (Expéditeur: TObject);commencer

Form1.Close; fin;

fin.

LA CLOCHE

Il y a ceux qui ont lu cette nouvelle avant vous.
Abonnez-vous pour recevoir les derniers articles.
Email
Nom
Nom de famille
Comment voulez-vous lire The Bell
Pas de spam