Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   Audio Session Test (https://www.delphipraxis.net/198338-audio-session-test.html)

EWeiss 25. Okt 2018 12:05


Audio Session Test
 
Projekt entfernt..

EWeiss 26. Okt 2018 15:17

AW: Audio Session Test
 
Da keine Rückantworten kommen gehe ich mal davon aus das es in Ordnung ist.
Danke! für das Ausprobieren.

gruss

KodeZwerg 26. Okt 2018 17:57

AW: Audio Session Test
 
Ich weiß noch nicht was für eine Art Rückmeldung Du erwartest.
Hier wäre zumindest eine:
starte ich das Programm ohne Audio abzuspielen ist es komplett leer.
spiele ich dann Audio ab bleibt es leer.
kann ja auch sein das das programm immer nur beim starten schaut ob was aktiv ist, weil da seh ich dann auch was :)
töte ich audio während deine app läuft verändert sich in der anzeige nichts.
manchmal zeigt der "expired" an zu den verschiedensten prozessen die bei mir niemals audio wiedergeben, webbrowser zum beispiel.
Die PID Anzeige funktioniert jedenfalls, habe die mal verglichen.

EWeiss 26. Okt 2018 19:55

AW: Audio Session Test
 
Zitat:

Ich weiß noch nicht was für eine Art Rückmeldung Du erwartest.
Das was mein Thread als Titel widerspiegelt.
Den Status der Audio Session.
Zitat:

Starte ich das Programm ohne Audio abzuspielen ist es komplett leer.
Na ja man sollte eigentlich wissen das eine Anwendung die mit Systeminternas arbeitet\arbeiten will Adminrechte benötigt.
Also ohne "als Admin ausführen" wird das wohl nix.
Zitat:

spiele ich dann Audio ab bleibt es leer.
Siehe Antwort 4 Zeilen höher.
Zitat:

kann ja auch sein das das programm immer nur beim starten schaut ob was aktiv ist, weil da seh ich dann auch was
Ne es reagiert dynamisch (Siehe erster Beitrag) auf die Session vergleiche diese mit dem System Mixer.
Ist der Leer nun dann ist es meine Anwendung auch.. Aber das möchte ich bezweifeln. (Systemsound ist immer aktiv)
Zitat:

töte ich audio während deine app läuft verändert sich in der anzeige nichts.
LOL, warum sollte sich da was ändern?
Die Anwendung ist weiterhin aktiv und kann Audio Wiedergeben warum sollte sich dann der Status ändern?
Ich bin immer noch in der Lage als bsp. die Lautstärke des Prozesses zu verändern unabhängig davon ob eine Wiedergabe statt findet solange wie der Prozess aktiv ist.

Manchmal verstehe ich deine Beiträge nicht! Du schreibst etwas ohne das geringste Hintergrund wissen.
Informiere dich doch erst einmal was eine Audio Session repräsentiert.

Aber für Anfänger!
  1. Ich starte mein Auto, Motor läuft (Kann es fahren?) weis ich zu dem Zeitpunkt noch nicht es wird nicht zu meiner Liste addiert.
  2. Ich fahre 1 Zentimeter, es kann fahren der Status ist "Live" und es wird zu meiner Liste addiert.
  3. Ich bleibe stehen aber ich weis ich könnte fahren (der Motor ist ja noch an) also ändert sich am zustand gar nichts er bleibt "Live"
  4. Ich schalte den Motor aus, es könnte fahren aber der Motor ist aus also ändert sich der Status auf "expired".
Zitat:

manchmal zeigt der "expired" an zu den verschiedensten prozessen die bei mir niemals audio wiedergeben
Dann solltest du vielleicht mal gleichzeitig den Mixer öffnen und sehen was sich dort abspielt.
Wenn der Prozess expired anzeigt dann wurde er vorher auch gestartet und teilt dem System mit "Hallo ich kann Audio wiedergeben".
Bei "expired" wurde er beendet und befindet sich nicht mehr im Ausführbaren zustand und eine Kontrolle über die Eigenschaften von Audio des geschlossenen Prozess ist nicht mehr nötig.

Wird dort der Browser als Session angezeigt dann hat es seine Richtigkeit und ja o graus er ist in der Lage Audio wiederzugeben und hat es mindestens einmal getan.

Spiel doch einfach mal diesen link ab..
Hmm... irgendwie seltsam der Webbrowser wird ja angezeigt.

Eine Audio Session sagt nichts darüber aus ob Audio wiedergegeben wird sondern signalisiert das der angezeigte Prozess grundsätzlich zur Audiowiedergabe fähig
und das mindestens 1 mal also beim Start (oder zwischendurch) des Prozesses getan hat.
Ob das nun der Webbrowser oder irgendein anderer Prozess ist spielt dabei keine rolle.
Zitat:

Die PID Anzeige funktioniert jedenfalls, habe die mal verglichen.
Warum auch nicht.. ist nix besonderes.

Wie dem auch sei denke funktioniert einwandfrei. Danke. Source gibt es leider keinen.

gruss

EWeiss 27. Okt 2018 23:49

AW: Audio Session Test
 
Quelltext hochgeladen.

gruss

EWeiss 28. Okt 2018 10:47

AW: Audio Session Test
 
Zwei Korrekturen..
1. Verhindern das gleiche Anwendungen doppelt oder dreifach angezeigt werden.
Delphi-Quellcode:
procedure TSessionThread.Execute;
var
  Success: HResult;
  Msg: TMsg;
  HR: HResult;
  i: integer;
  IntI: integer;
  M, N: integer;
  bDuplicate: boolean;
  ASessionInfo: TSessionInfo;
begin
  Success := CoInitializeEx(nil, COINIT_MULTITHREADED);

  FWnd := AllocateHWnd(WndProc);

  SessionNotification := TAudioSessionNotification.Create;
  SessionNotification.SetMsgHandle(FWnd);
  SetupDefaultAudioEndpoint;

  HR := SessionEnumerator.GetCount(i);
  if HR = S_OK then
     N := i else N := 0;

  M := 0;
  for i := 0 to (N - 1) do
  begin
    ASessionInfo := GetSessionInfoByIndex(i);
    if ASessionInfo.FileName <> '' then // is a invalid session info ?
    begin
      // Check to prevent duplicate registeration of audio session
      bDuplicate := false;
      for IntI := 0 to (M - 1) do
        if SessionInfo[IntI].PID = ASessionInfo.PID then
        begin
          // for the case of reuse of same PID (but different programs)
          if SessionInfo[IntI].State <> AudioSessionStateExpired then
          begin
            bDuplicate := true;
            break;
          end;
        end;

      if not bDuplicate then
      begin
        inc(M);
        SetLength(SessionInfo, M);
        SessionInfo[M-1] := ASessionInfo;
      end;
    end;
  end;
  FSessionCount := M;

  FWmiAsyncEvent := TWmiAsyncEvent.Create;
  FWmiAsyncEvent.OnProcessTerminated := ProcessTerminated;
  FWmiAsyncEvent.Start;

  try
    while not Terminated do
    begin
      if MsgWaitForMultipleObjects(0, nil^, False, 1000, QS_ALLINPUT) = WAIT_OBJECT_0 then
      begin
        while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do
        begin
          TranslateMessage(Msg);
          DispatchMessage(Msg);
        end;
      end;

      if bEnd then
        break;
    end;
  finally
    DeallocateHWnd(FWnd);
  end;

  FWmiAsyncEvent.Free;

  if SessionManager2 <> nil then
    SessionManager2.UnregisterSessionNotification(SessionNotification);

  CoUninit(Success);
end;
2. Den Thread absichern (Thread safe) (TTHread.Queue)
Delphi-Quellcode:
procedure TSessionThread.WndProc(var Msg: TMessage);
var
  i: integer;
  bDuplicate: boolean;
begin
  if Msg.Msg = WM_SessionCreate then
  begin
    ASessionInfo := GetSessionInfo(IAudioSessionControl(Msg.WParam));
    if ASessionInfo.FileName <> '' then  // Is a valid audio session ?
    begin
      // Check to prevent duplicate registeration of audio session
      bDuplicate := false;
      for i := 0 to (FSessionCount - 1) do
        if SessionInfo[i].PID = ASessionInfo.PID then
        begin
          // for the case of reuse of same PID (but different programs)
          if SessionInfo[i].State <> AudioSessionStateExpired then
          begin
            bDuplicate := true;
            break;
          end;
        end;

      if not bDuplicate then
      begin
        inc(FSessionCount);
        SetLength(SessionInfo, FSessionCount);
        SessionInfo[FSessionCount-1] := ASessionInfo;
        if Assigned(FOnAudioSessionCreate) then
          TTHread.Queue(nil,   // executes a procedure call within the main thread.
          procedure            // Unlike Synchronize, execution of the current thread
          begin                // is allowed to continue.
            FOnAudioSessionCreate(ASessionInfo, FSessionCount);
          end);
      end;
    end;
  end else
  Msg.Result := DefWindowProc(FWnd, Msg.Msg, Msg.WParam, Msg.LParam);
end;

procedure TSessionThread.ProcessTerminated(ProcessID: Cardinal);
var
  i: integer;
begin
  for i := 0 to (FSessionCount - 1) do
  begin
    if SessionInfo[i].PID = ProcessID then
    begin
      SessionInfo[i].State := AudioSessionStateExpired;
      ASessionInfo := SessionInfo[i];

      if Assigned(FOnAudioSessionExpire) then
        TTHread.Queue(nil,     // executes a procedure call within the main thread.
          procedure            // Unlike Synchronize, execution of the current thread
          begin                // is allowed to continue.
            FOnAudioSessionExpire(ASessionInfo, i);
          end);
      break;
    end;
  end;
end;
gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:30 Uhr.

Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf