I
files mp3 sono diventati oggi uno degli standard più usati per la trasmissione e la
riproduzione di files sonori in qualità simile a quella di un CD musicale. Esistono
molti programmi sul mercato che riproducono, codificano, trasmettono questi files. Uno in
particolare, chiamato WinAmp (forse il più conosciuto), permette qualcosa di
più. WinAmp infatti può essere comandato dall'esterno per mezzo di semplici
messaggi Windows. In questo modo è possibile costruire un'applicazione (che chiameremo
"Master") la quale, inviando dei semplici comandi, opera su WinAmp (che in questa veste diventa uno
"Slave") come normalmente si farebbe sulla sua interfaccia utente.
All'interno dell'applicazione Master si devono distinguere due passi fondamentali da eseguire
(o da racchiduere all'interno di proprie funzioni). Questi passi sono :
1) Reperimento dell'handle della finestra di WinAmp attualmente in esecuzione.
2) Trasmissione dei comandi a WinAmp.
Reperimento Handle
Reperire l'handle di una qualsiasi finestra di Windows può essere fatto semplicemente tramite
la funzione MFC CWnd::FindWindow, di cui riportiamo il prototipo :
static CWnd* PASCAL FindWindow(LPCTSTR lpszClassName,LPCTSTR lpszWindowName);
Ad esempio scriveremo le seguenti righe di codice :
CWnd * pWinAmpWnd;
pWinAmpWnd = FindWindow("Winamp v1.x",NULL);
HWND hWinAmpWnd;
hWinAmpWnd=pWinAmpWnd->m_hWnd;
Trasmissione Comandi
Una descrizione dettagliata di tutti i comandi che WinAmp può intercettare è riportata nel file
FRONTEND.TXT distribuito insieme a WinAmp. Rinominatelo FRONTEND.H ed includetelo nel vostro
progetto.
Riportiamo un esempio di codice che serve per cancellare la PlayList interna di WinAmp e mettere
quest'ultimo a suonare un pezzo di cui conosciamo il nome del file :
HWND hWinAmpWnd; // Supponiamo che qui ci sia l'handle della finestra di WinAmp
// Annullo la playlist attuale
::PostMessage(hWinAmpWnd,WM_WA_IPC,0,IPC_DELETE);
// Invio il nome del file da suonare
char NomeFile[255];
strcpy(NomeFile,"C:\\MP3\\CANZONE.MP3");
for (i=0;i<(strlen(NomeFile));i++)
::PostMessage(hWinAmpWnd,WM_WA_IPC,(LPARAM)((char)NomeFile[i]),IPC_PLAYFILE);
::PostMessage(hWinAmpWnd,WM_WA_IPC,0,IPC_PLAYFILE);
// Inizio la riproduzione
::PostMessage(hWinAmpWnd,WM_WA_IPC,0,IPC_STARTPLAY);
Note Conclusive
Occorre far notare due cose : la prima è che WinAmp gestisce internamente una sua PlayList. Il mio
personale consiglio è fare in modo (nel proprio programma) che WinAmp abbia nella PlayList un
solo brano alla volta. Gestire cioè la coda musicale all'interno del proprio programma.
La seconda osservazione è che WinAmp non prevede un sistema di ritrasmissione dei messaggi,
ovvero Winamp non avvisa se succede qualcosa (ad esempio quando termina l'esecuzione di un file).
Per questo motivo può essere necessario l'utilizzo di un timer che ogni intervallo
di tempo (da definire) verifica se WinAmp sta effettivamente suonando (cosa questa che invece è possibile).