1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| // Ceci est la fonction évènement OnTimer du timer créé lors de la mise en route de la surveillance du volume
class procedure TDummyForm.Timer1Timer(Sender: TObject);
var
ChannelVolumes: array[0..1] of Single; // ces variables sont prévues pour recevoir les PeakValues des deux canaux, par la méthode GetChannelsPeakValues
pVolumes: pSingle; // ce pointeur doit pointer sur le premier élément du tableau ci-dessus, et est passé en paramètre à GetChannelsPeakValues
Temp: Single; // cette variable reçoit la peak value générale, par la méthode GetPeakValue
vL, vR, vV: integer; // ce sont des variables techniques pour ajuster les valeurs reçues vers l'intervalle imposé [0..MaxOutput]
s: string; // variable temporaire pour afficher le titre - utiliser ici la variable ApplicationTitle NE MARCHE PAS !
HR: HResult; // code retour de la méthode GetChannelsPeakValues
begin
ttimer(sender).Enabled := false; // arrêter le timer, le temps de traiter l'évènement
ChannelVolumes[0] := 0; // assurer que le tableau est bien lis à zéro
ChannelVolumes[1] := 0;
pVolumes := pSingle(@ChannelVolumes[0]); // créer le pointeur vers le début du tableau
// si j'ai bien compris la documentation de MSDN, la méthode GetChannelsPeakValues prens 2 paramètres:
// le premier donne le nombre de canaux (deux dans mon cas, et j'ai vérifié le contenu de la variab
peak.GetPeakValue(Temp); // prendre la valeur instantané du volume global, résultat dans Temp ==> correct !
HR := peak.GetChannelsPeakValues(nChannels,pVolumes); // prendre les valeurs instantanées des deux canaux <========== Seul [1] est retourné, [2] reste à zéro !
// un pointeur vers le premier élément d'un tableau de flottants (de type Single)
// la méthode est supposé remplir le tableau avec les deux valeurs...
if nChannels<>2 then showmessage('nChannels='+inttostr(nChannels));
if HR<>S_OK then begin
if HR=E_INVALIDARG then showmessage('E_INVALIDARG')
else if HR=E_POINTER then showmessage('E_POINTER')
else showmessage('Erreur '+inttostr(integer(HR))+' = '+inttohex(integer(HR),8));
end;
// sans les deux lignes suivantes, le contenu du tableau ChannelVolumes reste à zéro, même pour le [1].
// avec ces deux lignes stupides, le [1] est renseigné correctement,, mais le [2] reste toujours à zéro !
s := ApplicationTitle;
SendMessage(MainFormHandle,WM_SETTEXT,0,integer(@s[1]));
// traduire en valeurs entre 0 et 100
vL := Round(ChannelVolumes[0] * MaxOutput); // valeur canal droit <======== valeur correcte !
vR := Round(ChannelVolumes[1] * MaxOutput); // valeur canal droit <======== ici, reste à zéro !
vV := Round(temp * MaxOutput); // valeur canal gauche <====== valeur correcte !
// envoyer ces valeurs dans des variables de l'application, si leur adresse a été passée en paramètre à la fonction InitSpeakerControl
if pVolumeOutputL<>nil then pVolumeOutputL^ := vL;
if pVolumeOutputR<>nil then pVolumeOutputR^ := vR;
if pVolume<>nil then pVolume^ := vV;
ttimer(sender).Enabled := true; // relancer le timer
end; |
Partager