Esecuzione file MP3
(Alessandro Silvestrini)
Avete disperatamente bisogno di suonare file mp3 dal vostro programma ? non possiedete librerie o controlli in grado di farlo e ricercate una soluzione veloce ed efficiente allo scopo ? Leggete le prossime righe e scoprirete come suonare file mp3 attraverso il Visual C++ con poche decine di righe di codice...
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).