Programarea pe delphi și nu numai - arhiva blogurilor multimedia sub control sau funcție

Acest articol discută funcția mciSendString, care este localizată în biblioteca winmm.dll. Această caracteristică poate da comenzi pentru orice dispozitiv MCI (Control Media Interface) (acceptată de sistem dispozitiv multimedia: WAV, MIDI, CDAudio, video, etc).






Aici este sintaxa sa:
MCIERROR mciSendString (
LPCTSTR lpszCommand,
LPTSTR lpszReturnString,
UINT cchReturn,
HANDLE hwndCallback
);
lpszCommand - comandă;
lpszReturnString - șirul rezultat;
cchReturn - dimensiunea în caracterele șirului rezultat;
hwndCallback este o fereastră de revocare (utilizată numai dacă parametrul "notificare" este setat în primul parametru).
Toate celelalte exemple vor fi scrise în Delphi, dar cred că nu va fi dificil să le traducem în alte limbi.
Acum suntem de acord cu parametrii mciSendString în următoarele exemple:

HwndCallback: va fi setat la 0;

CchReturn: va fi setat la 64 (în MSDN este scris că este lungimea maximă a unei erori care poate fi returnat parametrul lpszReturnString);

LpszReturnString: în acest parametru vom folosi variabila sbReturn: array [1..64] de char;

Este timpul să mergem la cel mai important parametru al funcției - lpszCommand. Această comandă este compilată cu ajutorul unor operatori speciali, dintre care unele sunt discutate mai jos.

deschis
Această comandă este acceptată de toate dispozitivele. Servește la inițializarea dispozitivului. Comanda Sintaxa:
'deschide lpszDeviceID lpszOpenFlags lpszFlags'
Opțiuni:
LpszDeviceID este identificatorul unuia dintre dispozitivele (sau a aliasului) înregistrat în secțiunea [MCI] a fișierului System.ini sau din registru. Poate indica și șoferul. De exemplu: cdaudio, sequencer, waveaudio, MyDriver.drv.
LpszOpenFlags este un steag care specifică parametri suplimentari de inițializare a dispozitivului. Nu voi da toata lista de valori ale acestui parametru pentru fiecare dispozitiv, și menționează numai valoarea „alias tip device_alias DEVICE_TYPE“, care deschide un tip de dispozitiv DEVICE_TYPE sub device_alias pseudonim.
LpszFlags - poate lua una dintre următoarele valori:

  1. Test - servește pentru a determina capacitatea de a executa o comandă, în timp ce comanda însăși nu este trimisă pe dispozitiv.
  2. Așteptați - cu acest steguleț, controlul programului este transferat numai după executarea comenzii.
  3. Notificați - cu acest steag, programul va primi un mesaj special, cu care va putea afla despre finalizarea comenzii, iar controlul va fi transmis fără întârziere.

exemplu:
mciSendString ('deschideți d: \ Sound.wav tip waveaudio alias MyWave așteptați', zero, 0, 0); - Conectează dispozitivul WaveAudio sub aliasul MyWave cu fișierul d: \ Sound.wav.

juca
Această comandă pornește redarea pentru unul dintre următoarele dispozitive: audio CD, video digital, secvențiator MIDI, video-disc, VCR și sunet de undă.
Comanda Sintaxa:
'play lpszDeviceID lpszPlayFlags lpszFlags'
Opțiuni:

  • LpszDeviceID este identificatorul unuia dintre dispozitivele (sau a aliasului) înregistrat în secțiunea [MCI] a fișierului System.ini. De exemplu: cdaudio, sequencer, waveaudio, avivideo.
  • LpszPlayFlags - un steag care determină tipul de redare a dispozitivului. Tabelul 1 prezintă valorile acestui parametru pentru fiecare dispozitiv, iar Tabelul 2 oferă o explicație pentru aceste valori.

exemplu:
mciSendString ('play cdaudio', 0, 0); - CD-ul cu muzică începe să fie redat fie de la început, fie de la poziția fixată de comanda "Pauză".

stare
Această comandă servește la definirea diferiților parametri. Există o mulțime de parametri, așa că nu le voi da tuturor. Mă voi concentra doar pe comenzile pentru CD-uri muzicale.

  • Numărul cântecului de tip cdaudio - pentru a determina tipul numărului de piesă
  • piesa curentă - pentru determinarea lungimii numărului melodiei curente - pentru definirea discului de numărul piesei lungime lungime - pentru determinarea compoziției lungimii cu numărul numărului media prezent - pentru determinarea prezenței unui disc în modul CD-ROM - pentru a determina starea de redare: joc, sa oprit, se opri, deschide , nu sunt pregătite, parcate, înregistrate sau căutând.
  • numărul de piese - pentru determinarea numărului de piste de pe poziția de disc - pentru a determina poziția curentă a numărului pistei poziției discului - pentru a determina poziția inițială a numărului pistei cu numărul gata - returnează true dacă aparatul poate accepta alte comenzi poziția de start - poziția de pornire a discului
  • format de timp - formatul de timp utilizat în această sesiune de lucru cu dispozitivul.






Aceasta se încheie cu teoria și se transformă în practică. Vom scrie un CD player muzical folosind funcția mciSendString. Desigur, nu am luat în considerare toate comenzile de care avem nevoie, dar cred că nu va exista probleme, pentru că Restul echipelor este destul de simplu de utilizat.
Creați un nou proiect în Delphi și aduceți formularul în vizualizarea dorită (a se vedea figura 1).

În acest scop, sunt necesare următoarele componente: TLabel (5 bucăți), TButton (7 piese), TListBox, TTrackBar și TTimer. Adăugați un sistem MMS în lista de module. Acum, declarați două variabile globale:
var
sbReturn: matrice [1..64] din char; // pentru valorile returnate
com: pchar; // comanda trimisă

După aceasta, puteți scrie funcții pentru a controla redarea:
// mergeți la piesa Track track
procedură gataotrack (Track: integer);
var
com: pchar;
începe
// setați ora la "Track: Minutes: Seconds: Frames"
com: = 'setarea formatului de timp cdaudio tmsf';
mciSendString (com, @sbReturn, 64, 0);
// începe redarea piesei Track
com: = pchar ('cdaudio de la' + inttostr (Track));
mciSendString (com, @sbReturn, 64, 0);
// setați formatul de timp în milisecunde
com: = 'set cdaudio format de timp ms';
mciSendString (com, @sbReturn, 64, 0);
se încheie;

// mergeți la următoarea melodie
procedura NextTrack;
var
cur: integer;
începe
cur: = GetCurrentTrack;
// dacă melodia curentă este ultima, apoi mergeți la prima
dacă (cur <>atunci
GoToTrack (cur + 1)
altfel
GoToTrack (1);
se încheie;

// mergeți la melodia anterioară
procedura PrevTrack;
var
cur: integer;
începe
cur: = getcurrentTrack;
dacă (cur> 1) atunci
GoToTrack (cur-1)
// dacă piesa curentă este prima, apoi mergeți la ultima
altfel
GoToTrack (GetTracksCnt);
se încheie;

// lungimea compoziției
funcția GetTrackLength (Track: integer): șir;
începe
com: = pchar ('status cdaudio track length' + inttostr (Track) + 'așteptați');
mciSendString (com, @sbReturn, 64, 0);
rezultat: = trim (sbReturn);
se încheie;

// lungimea discului
funcția GetCDLength: șir;
începe
com: = pchar ('status cdaudio length wait');
mciSendString (com, @sbReturn, 64, 0);
rezultat: = trim (sbReturn);
se încheie;

// play status
funcția GetStatus: șir;
începe
com: = 'așteptați modul de stare cdaudio';
mciSendString (com, @sbReturn, 64, 0);
rezultat: = trim (sbReturn);
se încheie;

// există un disc
funcție IsCDReady: șir;
începe
com: = 'starea cdaudio gata așteaptă';
mciSendString (com, @sbReturn, 64, 0);
rezultat: = trim (sbReturn);
se încheie;

// Opriți redarea
procedura StopCD;
începe
mciSendString ('stop cdaudio wait', @sbReturn, 64, 0);
se încheie;

// poziția inițială a compoziției
funcția GetTrackPos (Track: word): șir;
începe
com: = pchar ('status cdaudio track track' + inttostr (Track) + 'așteptare');
mciSendString (com, @sbReturn, 64, 0);
rezultat: = trim (sbReturn);
se încheie;

// poziția curentă a discului
funcția GetCDPos: șir;
începe
com: = pchar ('status cdaudio position wait');
mciSendString (com, @sbReturn, 64, 0);
rezultat: = trim (sbReturn);
se încheie;

Și acum scrieți operatorii pentru diferitele evenimente pentru componente:
// inițializați dispozitivul la momentul încărcării
procedura TForm1.FormCreate (expeditor: TObject);
începe
mciSendString ("cdaudio deschis", @sbReturn, 64, 0);
se încheie;

// ieșire închideți dispozitivul
procedura TForm1.FormDestroy (expeditor: TObject);
începe
mciSendString ('close cdaudio wait', @sbReturn, 64, 0);
se încheie;

// Butonul Următor
procedura TForm1.Button4Click (expeditor: TObject);
începe
NextTrack;
se încheie;

// butonul Prev (mergeți la melodia anterioară)
procedura TForm1.Button5Click (expeditor: TObject);
începe
PrevTrack;
se încheie;

// procedura pentru cronometru, repetând fiecare secundă
procedura TForm1.Timer1Timer (expeditor: TObject);
var
cur, i: cuvânt;
st: șir;
cnt: octet;
oră: cuvânt;
min, sec: octet;
t: întreg;
începe
// afișați starea redării
label5.Caption: = 'Stare:' + GetStatus;
dacă (GetStatus <>"joc") și
(GetStatus<>"oprit") și
(GetStatus<>"pauză") apoi ieșiți;
// setați formatul de timp în milisecunde
com: = 'set cdaudio format de timp ms wait';
mciSendString (com, @sbReturn, 64, 0);
cur: = GetCurrentTrack;
/ / selectați curentul
ListBox1.ItemIndex: = cur-1;

com: = 'status cdaudio time wait';
mciSendString (com, @sbReturn, 64, 0);
// informații despre informații
label2.Caption: = 'Format orar:' + trim (sbReturn);
label3.Caption: = 'Poziția de început:' + GetTrackPos (cur);
label4.Caption: = 'Poziția curentă:' + GetCDPos;

TrackBar1.Max: = strtoint (GetTrackLength (cur)) div 1000;
t: = strtoint (GetCDPos) -strută (GetTrackPos (cur));
t: = t div 1000;
TrackBar1.Position: = t;
oră: = t div 3600;
t: = t mod 3600;
min: = t div 60;
t: = t mod 60;
sec: = t;
st: = format ('.:.', [min, sec]);
dacă (ora> 0) atunci
st: = inttostr (oră) + ':' + st;
// afișați timpul de redare al melodiei curente
label1.Caption: = st;
se încheie;

// când faceți dublu clic pe o melodie din listă, începem să o jucăm
procedura TForm1.ListBox1DblClick (expeditor: TObject);
începe
GoToTrack (listaBox1.ItemIndex + 1);
se încheie;

/ Derulați melodia timp de 5 secunde
procedura TForm1.Button6Click (expeditor: TObject);
var
t: întreg;
începe
t: = strtoint (GetCDPos) +5000;
StopCD;
com: = pchar ('căuta cdaudio la' + inttostr (t) + 'așteptați');
mciSendString (com, @sbReturn, 64, 0);
PlayCD;
se încheie;

/ Rewind cântecul acum 5 secunde
procedura TForm1.Button7Click (expeditor: TObject);
var
t: întreg;
începe
t: = strtoint (GetCDPos) -5000;
StopCD;
com: = pchar ('căuta cdaudio la' + inttostr (t) + 'așteptați');
mciSendString (com, @sbReturn, 64, 0);
PlayCD;
se încheie;

Alo Mulțumesc foarte mult. Ma scriu doar uitandu-ma la articol (mai exact copierea mea pentru cunoastere mai departe =)), dar chiar si la prima vedere este foarte informativ si lizibil! (mai ales dacă Alexei Nikolayevich Rodionov scrie "Cool!", atunci cu siguranță îmi place))))
Doar scriu o lucrare pe tema procesării sunetului. Mulțumesc foarte mult.

De asemenea, DirectX nu a vrut să utilizeze (încă).

Apoi, am găsit o descriere generală a mciSendString, dar nu a fost clar fără exemple:

Multumesc din nou! Înainte eu

O echipă minunată și un exemplu de șic. Poate altcineva să vă spună dacă puteți modifica volumul sunetului redat. Eu însumi nu am găsit ceva.

Un dispozitiv MCI nu este găsit la redarea unui fișier wav
Pot rezolva asta cumva?







Trimiteți-le prietenilor: