![]() |
TV-Karte stummschalten
Hallo an alle,
vor kurzem habe ich eine TV-/Radio-Karte Lifetec 9415 von ca. 2003 ersteigert. Der Chip auf der Karte ist BT878 IMHO ist die Software leider mehr als schlampig programmiert :evil: Was mich am meisten stört, ist die Tatsache, dass, wenn man das Controlpad schließt, die Stummschaltung aufgehoben wird. Also: Ich muss das Fenster zur Steuerung der Karte permanent geöffnet lassen, damit ich auch mal was anderes als TV oder Radio höre. :wall: Ich habe zwar verschiedene Ideen, was man machen könnte, um diesen Mangel verschwinden zu lassen, bin mir aber nicht sicher, welche Vorgehensweise angebracht ist. 1. Ich könnte einen Dienst programmieren, der permanent per Timer prüft, ob das Steuerungsfenster offen ist und in dem Fall, dass es geschlossen worden ist, den Line-In-Eingang der Soundkarte stummschaltet. Q: Wo finde ich Codesnippets oder eine Dokumentation, wie man die Soundkarte steuert ? Wie programmiert man in Delphi einen Dienst ? 2. Der gleiche Dienst, der im Fall des Schließens des Fensters die TV-Karte direkt stummschaltet, wie man das mit dem Steuerungsfenster auch hinbekommt. Q: Wo bekomme ich Infos über Treiber API ? Vermutlich werden das die Hardwarefirmen eher unter Verschluss halten, welche API-Befehle es für Treiber gibt ? :gruebel: 3. Das gleiche wie unter 1. und 2. beschrieben, nur dass ich einfach "von Hand" durch Klicken auf ein Icon Soundkarte oder TV-Karte stummschalte. 4. Das Controlpad zwar offen lassen, es jedoch in der Taskleiste verschwinden lassen .. am besten, wenn es trotzdem in der Alt-Tab-Liste erscheint, wie die Dialoge, die man mit der Systemsteuerung aufruft z.B. Systemeigenschaften. Q: Wie bekommt man ein Fremdprogramm aus der Taskleiste raus, obwohl es weiter läuft ? 5. Gibt es vielleicht ein anderes Controlpad, mit dem man den Chip steuern kann, welches diesen Effekt nicht hat ? Gruß Rolf |
Re: TV-Karte stummschalten
normalerweise wird das Tonsignal über Line-IN oder Aux eingespeißt. Versuch mal das in der Tonsteuerung auszuschalten, ob dann der Ton noch an ist?
Hast du schonmal MoreTV ausprobiert? Das Prog ist auch ziemlich gut. |
Re: TV-Karte stummschalten
MoreTV hat schonmal den Effekt, dass es die TV-Karte stummschaltet, wenn es beendet wird :thumb:
MoreTV kann aber leider nicht den Radio-Teil bedienen. Ich bin eben ein furchtbar fauler Typ und denke, die 4 Klicks, die erforderlich sind, den Line-In-Eingang auszuschalten, müsste ein Programm auch automatisch hinbekommen, was einfach überwacht, ob das TV Capture Card Programm in der Prozessliste zu finden ist und dann automatisch dasselbe tut. :wink: |
Re: TV-Karte stummschalten
was genau ist jetzt deine Frage? Wie du den LineIn stumm schalten kannst? Oder wie du ermitteln kannst ob ein bestimmtes Programm offen ist?
|
Re: TV-Karte stummschalten
Ja, es geht im Prinzip darum, dass Line-In stummgeschaltet wird, was ich z.B. mit einem Miniprogramm ohne Fenster mit Verknüpfung auf dem Desktop erledigen würde.
Das wäre der erste Schritt. Als zweites würde ich versuchen, es zu automatisieren. Um das hinzubekommen, würde ich das Controlpad mit CreateProcess erzeugen, dabei dann wieder Line-In einschalten und mittels Timer überprüfen, ob der Prozess noch da ist und wenn nicht eben wieder ausschalten. Ich denke, zu überprüfen, ob ein Prozess läuft oder ein Fenster da ist, werde ich allein hinbekommen. Ein unsichtbares Fenster hinzubekommen, müsste ich auch schaffen :) ![]() ![]() |
Re: TV-Karte stummschalten
schau mal hier:
![]() |
Re: TV-Karte stummschalten
Nach auswerten der verschiedenen Links, die mir geholfen haben, fasse ich hier zusammen:
[code=delphi]program StartTV; uses Windows, Sysutils, Mmsystem; function GetMixer(compType: DWORD; var Control: TMixerControl): MMResult; var Line: TMixerLine; Controls: TMixerLineControls; begin ZeroMemory(@Line, SizeOf(Line)); Line.cbStruct:= SizeOf(Line); Line.dwComponentType:= compType; Result:= mixerGetLineInfo(0, @Line, MIXER_GETLINEINFOF_COMPONENTTYPE); if Result = MMSYSERR_NOERROR then begin ZeroMemory(@Controls, SizeOf(Controls)); Controls.cbStruct:= SizeOf(Controls); Controls.dwLineID:= Line.dwLineID; Controls.cControls:= 1; Controls.dwControlType:= MIXERCONTROL_CONTROLTYPE_MUTE; Controls.cbmxctrl:= SizeOf(Control); Controls.pamxctrl:= @Control; Result:= mixerGetLineControls(0, @Controls, MIXER_GETLINECONTROLSF_ONEBYTYPE); end; end; procedure SetMute(dwcompType: DWORD; Value: Boolean); var Mixer: TMixerControl; Details: TMixerControlDetails; BoolDetails: TMixerControlDetailsBoolean; Code: MMResult; begin Code:= GetMixer(dwcompType, Mixer); if Code = MMSYSERR_NOERROR then begin with Details do begin cbStruct:= SizeOf(Details); dwControlID:= Mixer.dwControlID; cChannels:= 1; cMultipleItems := 0; cbDetails:= SizeOf(BoolDetails); paDetails:= @BoolDetails; end; LongBool(BoolDetails.fValue):= Value; Code:= mixerSetControlDetails(0, @Details, MIXER_SETCONTROLDETAILSF_VALUE); end; if Code <> MMSYSERR_NOERROR then raise Exception.CreateFmt('SetMuteValue failure, '+ 'multimedia system error #%d',
Code:
Damit ist die Frage erledigt.
);
end; procedure WaitExecute(sEXE: String); var aTSI: TStartupInfo; aTPI: TProcessInformation; iRet: Integer; begin FillChar(aTSI, SizeOf(aTSI), #0); FillChar(aTPI, SizeOf(aTPI), #0); aTSI.CB := SizeOf(aTSI); if not CreateProcess(nil, PChar(sEXE), nil, nil, False, NORMAL_PRIORITY_CLASS, nil, nil, aTSI, aTPI) then RaiseLastWin32Error; SetMute(MIXERLINE_COMPONENTTYPE_SRC_LINE, false); { TMixerLine.dwComponentType component types for destinations and sources findet man in der mmsystem.pas} repeat iRet := MsgWaitForMultipleObjects(1, aTPI.hProcess, False, INFINITE, (QS_ALLINPUT)); until iRet = (WAIT_OBJECT_0); SetMute(MIXERLINE_COMPONENTTYPE_SRC_LINE, true); CloseHandle(aTPI.hProcess); end; begin WaitExecute('C:\Programme\TC Capture Card\HDTV.EXE'); end. Vielleicht kann man ja den Code mit ein bisschen Schliff in die Codelib bringen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:45 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