Téléchargement:
Mixer.zip (61Ko)

Un mixer audio complet sous-classé

J'ai réalisé ce mixer pour mon usage personnel, car je voulais voir en un coup d'œil toutes les lignes et tous les contrôles respectifs, ce qui n'est pas le cas avec les mixers de Windows.
De plus, le mixer de Windows ne gère pas certains contrôles (par exemple les MIXERCONTROL_CONTROLTYPE_SINGLESELECT).

Ce projet est assez compliqué, d'autant qu'une partie importante du code sert à créer et à positionner les différents contrôles audio de façon dynamique selon les caractéristiques du mixer. 
Pour gagner de la place, les noms des contrôles ("Volume", "Mute", "Select", "Boost", ...) apparaissent en Tool Tip Text.
Je vais juste ici présenter les grandes lignes et le principe général.

Le sous-classement :
Lorsque d'autres applis ou d'autres mixers modifient les réglages de certains contôles (volume, mute, ...), il faut actualiser la position des curseurs et les valeurs des contrôles sur notre mixer. C'est ce qu'on appelle le rafraîchissement.

2 méthodes sont possibles :

Exception : le seul contrôle ne pouvant pas être rafraîchi par sous-classement est le vu-mètre, car il change tout le temps de valeur, et le mixer n'envoie aucun message à son sujet. On est donc obligé d'utiliser un Timer spécialement pour le vu-mètre (s'il y en a un pour le mixer en cours).

Précautions sur le sous-classement en général :
Le code VB sous-classé est très difficile à debugger, car en mode interprétation (non compilé), le programme s'exécute au sein de VB lui-même et intercepte donc tous les messages (procédure "WndProc"). En cas de bug, impossible de stopper l'exécution, il faut tuer le process de VB complètement, et relancer le tout.
C'est pourquoi je conseille de ne pas sous-classer lors de la mise au point du code. Le sous-classement n'est pas indispensable pour tester les différentes procédures, les contrôles ne sont plus rafraîchis automatiquement, c'est tout.
Pour supprimer temporairement le sous-classement, il suffit de mettre en commentaire la ligne suivante :
    ' On sous-classe
    ' SubclassForm Me

qui se trouve à la fin de Private Sub Form_Load()

Les grands principes :

Il existe d'autres types de contrôle plus rarement rencontrés. Le projet effectue une recherche exhaustive de TOUS les contrôles existants pour le mixer en cours, mais ne traite que ceux des types mentionnés. Cependant, on peut voir la liste des contrôles non traités et leur description en cliquant sur le bouton "Info" (invisible s'il n'y a aucun contrôle non traité). 

Les procédures principales du Form

Notre objectif : relever tous les MIXERCONTROL (= mxc) existants, et remplir un tableau mxc() qu'on redimensionnera au fur et à mesure (Redim Preserve)

Les membres de mxc() qui nous intéressent particulièrement sont :
- Le nom court  szShortName
- Le nom long szName
- Son identificateur (numéro unique) dwControlID
- Sa nature (volume, mute, réglage ON/OFF, ...) dwControlType
- Ses valeurs possibles MAX et MIN lMaximum et lMinimum
- Dans le cas particulier d'un contrôle de type Multipexeur cMultipleItems

 REMARQUE À PROPOS DE LA STRUCTURE MIXERCONTROL
=============================================
 J'ai dû changer la nature des 2 membres suivants qui sont dans les docs :
    szShortName As String * MIXER_SHORT_NAME_CHARS
    szName As String * MIXER_LONG_NAME_CHARS

Et que j'ai modifiés de la manière suivante :
    szShortName(MIXER_SHORT_NAME_CHARS - 1) As Byte
    szName(MIXER_LONG_NAME_CHARS - 1) As Byte

Car les tableaux mxc() ne fonctionnaient pas, probablement dû à des questions de texte ASCII ou UNICODE (caractères codés sur 1 ou 2 octets)
Pour récupérer un nom sous forme de texte, il faut maintenant faire : ByteToString(mxc(I).szName, MIXER_LONG_NAME_CHARS - 1)

Les procédures principales du module
Principes de la gestion des contrôles graphiques
Retour à l'accueil