Einzelnen Beitrag anzeigen

EWeiss
(Gast)

n/a Beiträge
 
#123

AW: TAudioVolume Komponente incl. System Mixer

  Alt 18. Mai 2018, 10:03
Zitat:
Unter Windows 10 kann man so viele Threads (die andere Aufgaben machen) erstellen wie man möchte
Daher ist es schon gut wenn mehr Leute an der Sache arbeiten.. Hobby mäßig natürlich
Eine wirklich fertige und vor allem gute Komponente in der Hinsicht habe ich über die Jahre nicht wirklich ausmachen können für Delphi.

Ich habe jetzt folgendes gemacht. (Bin dafür wieder auf Sendmessage umgestiegen da ich nicht weis wie man den Thread in die Class TAudioVolume integriert.)
*.pas angehängt.

Wenn die Message ausgelöst wird.

Delphi-Quellcode:
procedure TSessionThread.WndProc(var Msg: TMessage);
begin

  if FThreadHandle <> 0 then
  begin
    case Msg.Msg of
      WM_SessionCreate:
        Msg.Result := SendMessage(FThreadHandle, WM_SessionCreate, Msg.WParam, Msg.LParam);
      WM_SessionDestroy:
        Msg.Result := SendMessage(FThreadHandle, WM_SessionDestroy, Msg.WParam, Msg.LParam);
    else
      Msg.Result := DefWindowProc(FWnd, Msg.Msg, Msg.WParam, Msg.LParam);
    end;
  end else
    Msg.Result := DefWindowProc(FWnd, Msg.Msg, Msg.WParam, Msg.LParam);
end;
Delphi-Quellcode:
procedure TAudioVolume.ProcessMsg(var Msg: TMessage);
begin

  case Msg.Msg of
    WM_SessionCreate:
      if Assigned(FOnSessionCreated) then
        OnSessionCreated(IAudioSessionControl(Msg.WParam));

    WM_SessionDestroy:
      if Assigned(FOnSessionDisconnected) then
        OnSessionDisconnected(Msg.WParam);
  end;
end;
dann kommt sie hier an.
in OnSessionCreated.. sorge ich dann dafür das nur eine Message der gleichen PID zur Anwendung durchgelassen wird.

Delphi-Quellcode:
function TAudioVolume.OnSessionCreated(const NewSession: IAudioSessionControl): HResult;
var
  SessionControl2: IAudioSessionControl2;
  PID: uint;
  IntI: Integer;
begin

  Result := S_OK;

  if Supports(NewSession, IAudioSessionControl2, SessionControl2) then
  begin
    SetLength(PidList, PIDIndex + 1);
    SessionControl2.GetProcessID(PID);

    for IntI := 0 to (Length(PidList) - 1) do
      if PidList[IntI] = PID then
      begin
        SessionControl2 := nil;
        exit;
      end;
    PidList[PIDIndex] := PID;
  end;

  if (MainThreadID <> GetCurrentThreadId) then
  begin
    TThread.Synchronize(nil,
      procedure
      begin
        if Assigned(FOnSessionCreated) then
        begin
          SessionPIDCreated := PID;
          FOnSessionCreated(NewSession);
          inc(PIDIndex);
        end;
      end);
  end;

end;

das funktioniert soweit. (Bei Message Boxen) aber auch da mosert Delphi schon rum wegen Deadlock.

Aber!
Ich kann keine neue Grafikkomponente erstellen der Thread blockt irgendwie sobald ich einen zugriff auf einer der Funktionen von TAudioVolume starte.
Dann hängt der Thread.

Ein einfacher Aufruf von SimpleVolume := nil; reicht da schon.

Keine Ahnung was da wieder abgeht.
Ich weis nicht wie ich dann die Komponente erstellen soll wenn nicht hier.

PS:
OnSessionDisconnected funktioniert nie egal ob mit Event Thread oder nicht.
Ist das bei dir auch so?
Wenn ja muss ich das später über die PID steuern.

gruss

Geändert von EWeiss (18. Mai 2018 um 15:12 Uhr)
  Mit Zitat antworten Zitat