Erzeugst du die visuellen Elemente aufgrund der Größe des Rückgabewertes von TAudioVolume.GetSessionCount oder aufgrund der Länge des Arrays FAudioSessionList?
Sind diese Zeilen noch aktuell oder inzwischen auch geändert/auskommentiert?
Delphi-Quellcode:
HR := pEnumerator.GetCount(FSessionCount);
Succeeded(HR) then
SetLength(FAudioSessionList, FSessionCount + 1);
aufgrund von
des Arrays FAudioSessionList TAudioVolume.GetSessionCount deshalb das SCount
Es wurden so viele Elemente erstellt wie Session <> AudioSessionStateExpired
Also meine Änderung die ich aktuell verwende damit du nicht raten musst.. sorry.
Habe es mal mit deinem Schnipsel versucht das gleiche Spiel.
Nur als Gegenprobe zu meiner Version.
Delphi-Quellcode:
function TAudioVolume.GetSessionCount: integer;
var
DeviceEnumerator: IMMDeviceEnumerator;
SessionManager: IAudioSessionManager;
SessionManager2: IAudioSessionManager2;
AudioDevice: IMMDevice;
SessionEnumerator: IAudioSessionEnumerator;
SessionControl: IAudioSessionControl;
SessionCount: Integer;
HR: HResult;
begin
Result := 0;
SessionCount := 0;
HR := CoCreateInstance(CLASS_IMMDeviceEnumerator, nil, CLSCTX_ALL, IID_IMMDeviceEnumerator, DeviceEnumerator);
if Succeeded(HR) then
begin
HR := DeviceEnumerator.GetDefaultAudioEndpoint(eRender, eMultimedia, AudioDevice);
if Succeeded(HR) then
begin
HR := AudioDevice.Activate(IID_IAudioSessionManager, CLSCTX_INPROC_SERVER, nil, IUnknown(SessionManager));
if Succeeded(HR) then
begin
if Supports(SessionManager, IID_IAudioSessionManager2, SessionManager2) then
begin
HR := SessionManager2.GetSessionEnumerator(SessionEnumerator);
if Succeeded(HR) then
begin
HR := SessionEnumerator.GetCount(SessionCount);
if Succeeded(HR) then
begin
Setlength(FAudioSessionList, SessionCount + 1);
Result := SessionCount;
end;
SessionControl := nil;
end;
SessionEnumerator := nil;
end;
SessionManager2 := nil;
end;
SessionManager := nil;
end;
AudioDevice := nil;
end;
DeviceEnumerator := nil;
end;
Delphi-Quellcode:
function TAudioVolume.GetSessionPID(Index: Integer; AudioDevice: IMMDevice): DWORD;
var
SessionControl2: IAudioSessionControl2;
SessionControl: IAudioSessionControl;
pEnumerator: IAudioSessionEnumerator;
PID: DWORD;
HR: HResult;
begin
Result := 0;
if Assigned(SessionManager2) then
begin
HR := AudioDevice.Activate(IID_IAudioSessionManager2, CLSCTX_ALL, nil, IUnknown(SessionManager2)
);
if Succeeded(HR) then
begin
HR := SessionManager2.GetSessionEnumerator(pEnumerator);
if Succeeded(HR) then
begin
HR := pEnumerator.GetSession(Index, SessionControl);
if Succeeded(HR) then
begin
HR := SessionControl.QueryInterface(IAudioSessionControl2, SessionControl2);
if Succeeded(HR) then
begin
HR := SessionControl2.GetProcessID(PID);
if Succeeded(HR) then
Result := PID;
end;
end;
end;
end;
end;
end;
Bei deiner Version gibt mir sessioncount 0 zurück weil ich das AudioDevice neu initialisiere.
Nach jeden Neustart der Anwendung addiert sich der Count über SessionEnumerator.GetCount(SessionCount); um 1!
Das verstehe wer will.
Die Anzahl der Session unter Windows im, Mixer bleiben aber gleich.
gruss