AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Audio Session Test

Audio Session Test

Ein Thema von EWeiss · begonnen am 25. Okt 2018 · letzter Beitrag vom 28. Okt 2018
Antwort Antwort
EWeiss
Projekt entfernt..

Geändert von EWeiss (24. Jul 2019 um 05:47 Uhr)
 
EWeiss
 
#2
  Alt 26. Okt 2018, 16:17
Da keine Rückantworten kommen gehe ich mal davon aus das es in Ordnung ist.
Danke! für das Ausprobieren.

gruss
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

 
Delphi 11 Alexandria
 
#3
  Alt 26. Okt 2018, 18:57
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.
  Mit Zitat antworten Zitat
EWeiss
 
#4
  Alt 26. Okt 2018, 20:55
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

Geändert von EWeiss (11. Jul 2019 um 16:53 Uhr)
  Mit Zitat antworten Zitat
EWeiss
 
#5
  Alt 28. Okt 2018, 00:49
Quelltext hochgeladen.

gruss
  Mit Zitat antworten Zitat
EWeiss
 
#6
  Alt 28. Okt 2018, 11:47
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

Geändert von EWeiss (28. Okt 2018 um 11:50 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:37 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz