AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte TAudioVolume Komponente incl. System Mixer
Thema durchsuchen
Ansicht
Themen-Optionen

TAudioVolume Komponente incl. System Mixer

Ein Thema von EWeiss · begonnen am 6. Mai 2018 · letzter Beitrag vom 24. Jul 2019
Antwort Antwort
EWeiss
(Gast)

n/a Beiträge
 
#1

AW: TAudioVolume Komponente incl. System Mixer

  Alt 17. Mai 2018, 12:32
Zitat:
Einzig und allein der Aufruf von GetSessionEnumerator ist der entscheidende Punkt.
Entschuldige bitte das hatte ich schon im Quelltext enthalten seit urgedenken.
Das entscheidende ist der Zusätzliche Thread für die Events nichts anderes.

Zitat:
Wie denn nun Herr Weiss?
Mit oder ohne Thread? Entscheiden Sie sich.
Nun.. sorry manche verstehen es einfach nicht.

Also nochmal.
Deine erster Versuch war in einer Anwendung welche nur 1 Thread beinhaltet und das war\ist nicht gleichzusetzen mit TAudioVolume.
OK? Gut dann weiter.

Ich hatte dich aufgefordert so wie in TAudioVolume eine Anwendung zu erstellen bzw. zu testen mit den Begebenheiten wie sie in TAudioVolume vorlagen.
Was hast du gemacht einen extra Thread für die Events erstellt der aber in TAudioVolume zu der zeit nicht existierte.
OK? Gut dann weiter.

Hättest du dich an der Basis gehalten dann wäre dir genau das Aufgefallen das TAudioVolume keinen extra Thread für SessionCreate erstellt hat.
So! Auf mehr wollte ich gar nicht raus.

Und ohne diesen besagten Thread würde deine Anwendung ins leere laufen so wie es bei TAudioVolume war.

Zitat:
einbaust (Plus ActiveX, ComObj in die Uses), wird dies Verwendet, ohne die DPR ändern zu müssen. Es wird automatisch gesetzt, wenn deine Unit verwendet wird.
Danke Holger werde es mal testen

EDIT:
Nein es geht nicht!
Teste es selbst mit TAudioVolume.
Das ist warum ich sage man muss mit der Basis arbeiten.

Zitat:
Windows 7 System and Windows 10 System operate differently.The new audio session create event is fired on Windows 10 System but not on Windows 7 Systemregardless of the parameter of CoInitializeEx(COINIT_APARTMENTTHREADED or COINIT_MULTITHREADED),if it is defined in the TAudioVolume.Create method.However new audio session create event is fired if we use a seperate thread to receive the events.So, you should use a thread to accept the event ( Create the thread in TAudioVolume.Create method,destroy the thread in TAudioVolume.Destroy method ).
Zitat:
Diese überlangen und sehr komplizierten Non-VCL-Quelltexte, mit denen du normalerweise hantierst, tragen natürlich dazu bei.
Diese funktionieren hervorragend du musst dich nur mal herablassen und sie testen.

gruss

Geändert von EWeiss (17. Mai 2018 um 12:59 Uhr)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.079 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: TAudioVolume Komponente incl. System Mixer

  Alt 17. Mai 2018, 14:51
Zitat:
Windows 7 System and Windows 10 System operate differently.The new audio session create event is fired on Windows 10 System but not on Windows 7 Systemregardless of the parameter of CoInitializeEx(COINIT_APARTMENTTHREADED or COINIT_MULTITHREADED),if it is defined in the TAudioVolume.Create method.However new audio session create event is fired if we use a seperate thread to receive the events.So, you should use a thread to accept the event ( Create the thread in TAudioVolume.Create method,destroy the thread in TAudioVolume.Destroy method ).
Wo kommt das her? Quelle?

Und schriebst doch ein paar Beiträge vorher, das du mit meiner Memo-Testanwendung auf deinen Windows 7 ein OnSessionCreated erhalten hast.
Ist dem doch nicht so?

EDIT: https://www.delphipraxis.net/1402335-post112.html
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: TAudioVolume Komponente incl. System Mixer

  Alt 17. Mai 2018, 19:00
Zitat:
Ist dem doch nicht so?
Klar.. habe ich gesagt und dem ist auch so aber nur in einer Anwendung die 1 Thread verwendet.
Wenn du mehr verwendest wie ich in TAudioVolume kommst du um eine extra Event Thread nicht herum.
Wie oft habe ich das jetzt schon geschrieben? Hmmm....

gruss
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.079 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: TAudioVolume Komponente incl. System Mixer

  Alt 18. Mai 2018, 07:53
Eine VCL-Anwendung wie die oben gezeigte besteht aber in der Regel aus mindestens drei Threads.
Zumindest laut Anzeige der IDE.

Das Verhalten scheint es so nur in Windows 7 zu geben.
Unter Windows 10 kann man so viele Threads (die andere Aufgaben machen) erstellen wie man möchte, es wird OnSessionCreate ausgelöst. Sogar im Mainthread und im extra dafür erstellten Thread.
Siehe Screenshot.

Vielleicht doch mal ein Grund zu wechseln und upzudaten? Hihi, war nur Spaß!
Miniaturansicht angehängter Grafiken
onsessioncreate.jpg  
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: TAudioVolume Komponente incl. System Mixer

  Alt 18. Mai 2018, 09: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 14:12 Uhr)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.079 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: TAudioVolume Komponente incl. System Mixer

  Alt 18. Mai 2018, 09:33
1. Bitte beachte was ich einige Seiten zuvor über das Casten und Versenden von Interface-Pointern schrieb.
2. OnSessionDisconnected könnte möglicherweise mit der 3 Minuten-Regel zusammenhängen, die HolgerX einige Seiten zuvor herausgefunden hat. Hast du das mal länger laufen lassen?
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

AW: TAudioVolume Komponente incl. System Mixer

  Alt 18. Mai 2018, 09:36
Zitat:
Bitte beachte was ich einige Seiten zuvor über das Casten und Versenden von Interface-Pointern schrieb.
Ja ich weis das es keine gute Lösung ist.
Nur wie mache ich es besser?

Dazu müsste ich den Event Thread in TAudioVolume integrieren nur weis nicht wie. Sorry

gruss
  Mit Zitat antworten Zitat
Antwort Antwort


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 16:21 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz