Jump to content

How to get notified


SnoopyDog

Recommended Posts

Hallo forum. Da die Antwort auf diese PM auch allgemein interessant sein dürfte, hier eine öffentliche Antwort:

 

Hallo!

Da die SDK meiner Meinung nach leider teilweise recht dürftig ist, wollte ich mal anfragen, ob du mir evtl. ein wenig Code zur Verfügung stellen kannst welches die EventMsg Routine nutzt.

 

Im Endeffekt fehlen mir ein paar Informationen, die ich so im Forum nicht finden konnte und die mir scheinbar auch leider niemand beantworten will.

 

Vielleicht kannst du helfen:

1.) Wie kann ich im Plugin Notifies erhalten für STARTREC, STOPREC etc. ?

2.) Wie kann ich die OSD Funktionen nutzen (Stelle XYZ Text als OSD) dar?

 

Ich danke.

 

Für die Benachrichtigungs-API ist eigentlich der "dvbvspy" Quelltext eine gute Hilfe (hat mir gereicht), aber hier noch einmal ein beispielhafter Code. Man muß nicht alle Benachrichtigungsroutinen implementieren. Wenn etwas nicht gebraucht wird, einfach weglassen und nicht in "CreateDVBViewerClasses" damit verbinden:

 

INTERFACE

USES  ....
  ActiveX,
  OleServer,
  DVBViewerServer_TLB;


TYPE  TfrmDemo = CLASS(TForm)
	PRIVATE
	  { Private-Deklarationen }
	  fConnected : BOOLEAN;
	  DVBViewer	   : TDVBViewer;
	  DVBViewerEvents : TDVBViewerEvents;
	  DataManager	 : IDataManager;
	PROTECTED
	  PROCEDURE DVBViewerEventAction(Sender: TObject; ActionID: INTEGER);
	  PROCEDURE DVBViewerEventChannelChange(Sender: TObject; ChannelNr: INTEGER);
	  PROCEDURE DVBViewerEventClose(Sender : TObject);
	  PROCEDURE DVBViewerEventControlChange(ASender: TObject; WindowID,ControlID: INTEGER);
	  PROCEDURE DVBViewerEventOSDWindow(ASender: TObject; WindowID: INTEGER);
	  PROCEDURE DVBViewerEventPlaybackEnd(Sender: TObject);
	  PROCEDURE DVBViewerEventPlaybackStart(Sender: TObject);
	  PROCEDURE DVBViewerEventPlaystateChange(ASender: TObject; RendererType,State: TOleEnum);
	  PROCEDURE DVBViewerEventRDS(Sender : TObject; CONST RDS : WIDESTRING);
	  PROCEDURE DVBViewerEventSelectedItemChange(Sender: TObject);
	  PROCEDURE SetConnected (Value : BOOLEAN);
	PRIVATE
	  PROCEDURE CreateDVBViewerClasses;
	  PROPERTY Connected : BOOLEAN READ fConnected WRITE SetConnected;
	PUBLIC
	  { Public-Deklarationen }
	  CONSTRUCTOR Create (aOwner : TComponent); OVERRIDE;
	  DESTRUCTOR Destroy; OVERRIDE;
  END;

IMPLEMENTATION

// --------------------------------------------------------------------
// Irgendwo zum Initialisieren irgendwo die Property "Connected" setzen:
//
//   Connected := TRUE;
//
// Zum Deinitialisieren:
//
//   Connected := FALSE;
// --------------------------------------------------------------------

CONSTRUCTOR TfrmDemo.Create (aOwner : TComponent);
 BEGIN
INHERITED Create(aOwner);
CreateDVBViewerClasses;
 END;  { Create }

DESTRUCTOR TfrmLCDDriver.Destroy;
 BEGIN
Connected := FALSE;
DVBViewerEvents.Free;
DVBViewer.Free;
INHERITED Destroy;
 END;  { Destroy }

PROCEDURE TfrmDemo.CreateDVBViewerClasses;
 BEGIN
DVBViewer := TDVBViewer.Create(Self);
DVBViewer.AutoQuit	:= FALSE;
DVBViewer.AutoConnect := FALSE;
DVBViewer.ConnectKind := ckRunningInstance;
//
DVBViewerEvents := TDVBViewerEvents.Create(self);
DVBViewerEvents.AutoConnect  := FALSE;
DVBViewerEvents.ConnectKind  := ckAttachToInterface;
//
DVBViewerEvents.OnAction			 := DVBViewerEventAction;
DVBViewerEvents.OnChannelChange	  := DVBViewerEventChannelChange;
DVBViewerEvents.OnDVBVClose		  := DVBViewerEventClose;
DVBViewerEvents.OnControlChange	  := DVBViewerEventControlChange;
DVBViewerEvents.OnOSDWindow		  := DVBViewerEventOSDWindow;
DVBViewerEvents.OnPlaybackEnd		:= DVBViewerEventPlaybackEnd;
DVBViewerEvents.OnPlaybackStart	  := DVBViewerEventPlaybackStart;
DVBViewerEvents.OnPlaystateChange	:= DVBViewerEventPlaystateChange;
DVBViewerEvents.OnRDS				:= DVBViewerEventRDS;
DVBViewerEvents.OnSelectedItemChange := DVBViewerEventSelectedItemChange;
 END;  { CreateDVBViewerClasses }

PROCEDURE TfrmDemo.SetConnected (Value : BOOLEAN);
 // Stellt Verbindung zum DVBViewer her bzw. trennt sie wieder.
 VAR Something : IUnknown;
 BEGIN
IF Value <> fConnected THEN BEGIN
  TRY
	IF Value THEN BEGIN
	  // Einfache Abfrage, ob er läuft:
	  GetActiveObject(CLASS_DVBViewer,NIL,Something); 
	  IF Something <> NIL THEN BEGIN
		// Er läuft: Verbinden. 
		DVBViewer.Connect;
		DVBViewerEvents.ConnectTo(DVBViewer.Events);
		DataManager := DVBViewer.DataManager;
		fConnected := Value;
	  END;  { THEN }
	END  { THEN }
	ELSE BEGIN
	  DVBViewerEvents.Disconnect;
	  DVBViewer.Disconnect;
	  fConnected := Value;
	  //
	  // Kann evtl. auch entfallen.
	  //
	  DVBViewerEvents.Free;
	  DVBViewer.Free;
	  Sleep(1000);
	  CreateDVBViewerClasses;
	  // Bis hier. Bitte selbst probieren.
	END;  { ELSE }
  EXCEPT
	IF NOT Value THEN
	  fConnected := FALSE;
  END;
END;  { THEN }
 END;  { SetConnected }

// --------------------------------------------------------------------
// Event-Benachrichtigungsroutinen.
// ACHTUNG: Code sollte keine allzulange Laufzeit haben, das bringt den
// DVBViewer durcheinander. Beispiel: Schrittweises Debuggen.
// Eigenen Code sicherheitshalber immer in
//	TRY
//	  EigenerCode;
//	EXCEPT
//	  Fehlerbehandlung;
//	END;
// einfassen.
// --------------------------------------------------------------------

PROCEDURE TfrmDemo.DVBViewerEventAction(Sender: TObject; ActionID: INTEGER);
 BEGIN
// Wird bei vielen Events aufgerufen.
 END;  { DVBViewerEventAction }

PROCEDURE TfrmDemo.DVBViewerEventChannelChange(Sender: TObject; ChannelNr: INTEGER);
 BEGIN
// Wird bei Kanalwechsel aufgerufen.
 END;

PROCEDURE TfrmDemo.DVBViewerEventClose(Sender : TObject);
 BEGIN
// Beenden.
TRY
  Connected := FALSE;
EXCEPT
END;
 END;

PROCEDURE TfrmDemo.DVBViewerEventControlChange(ASender: TObject; WindowID,ControlID: INTEGER);
 BEGIN
// Aktives Control im OSD hat sich geändert.
 END;

PROCEDURE TfrmDemo.DVBViewerEventOSDWindow(ASender: TObject; WindowID: INTEGER);
 BEGIN
// OSD-Window-ID hat sich geändert.
 END;

PROCEDURE TfrmDemo.DVBViewerEventPlaybackEnd(Sender: TObject);
 BEGIN
// Playback Ende.
 END;

PROCEDURE TfrmDemo.DVBViewerEventPlaybackStart(Sender: TObject);
 BEGIN
// Playback start
 END;

PROCEDURE TfrmDemo.DVBViewerEventPlaystateChange(ASender: TObject; RendererType,State: TOleEnum);
 BEGIN
// Playback: Status geändert (Play => Pause, etc.)
 END;

PROCEDURE TfrmDemo.DVBViewerEventRDS(Sender: TObject; CONST RDS : WIDESTRING);
 BEGIN
// Radio: Neuer Radio-Text
 END;

PROCEDURE TfrmDemo.DVBViewerEventSelectedItemChange(Sender: TObject);
 BEGIN
// Selektiertes Element im OSD hat sich geändert.
 END;

 

Um Text auf dem OSD auszugeben, beispielsweise

 

DVBViewer.OSD.ShowInfoInTVPic(Msg,Timeout);

 

aufrufen. Um Text "beliebig" lange auszugeben, einen extrem hohen Wert für "Timeout" übergeben, um den Text wieder verschwinden zulassen, denselben Text noch einmal mit Timeout = 10 . Leer darf der Text nicht sein!

 

Nachtrag: Obigen Quelltext nochmal geändert.

 

Und hier exemplarisch ein paar Konstanten, die man brauchen kann:

CONST
  // -----------------------------------------------------------------------

  EVENT_CHANNEL_UP   = 9;
  EVENT_CHANNEL_DOWN = 8;

  EVENT_OSD_EXIT	 = 84;

  EVENT_OSD_UP	   = 78;
  EVENT_OSD_DOWN	 = 79;
  EVENT_OSD_LEFT	 = 2000;
  EVENT_OSD_RIGHT	= 2100;

  EVENT_OSD_GREEN	= 75;
  EVENT_OSD_YELLOW   = 76;

  EVENT_VOLUME_CHANGE = 8251;

  EVENT_JUMP_BACK	= 102;
  EVENT_JUMP_FORE	= 103;

  EVENT_CHAPTER_BACK = 112;
  EVENT_CHAPTER_FORE = 113;

  EVENT_SPEED_UP	 = 12382;
  EVENT_SPEED_DOWN   = 12383;

  EVENT_STOP		 = 114;

  // -----------------------------------------------------------------------

  NO_OSD				  = -1;
  OSD_WIN_MUSIC		   = 5;
  OSD_WIN_MOVIES		  = 6;
  OSD_WIN_MINIEPG		 = 500;
  OSD_WIN_EPG_DETAIL	  = 501;
  OSD_WIN_RECORDINGS	  = 603;
  OSD_WIN_TELETEXT		= 2000;
  OSD_WIN_PLAYLIST		= 2004;
  OSD_WIN_PLAYBACK_STATUS = 2901;

 

Quelltext nochmals geändert. Da war noch etwas zu spezielles drin...

Edited by SnoopyDog
Link to comment

Nur was macht man, wenn man zwei Instanzen nutzen will? Die COM Schnittstelle ist ja immer nur EINMAL registriert und selbst als .dll kann man leider intern nicht eine zweite COM nutzen :-(

Link to comment

Das geht doch (?). Ich habe parallel dasselbe laufen. Einmal obiges als DLL im DVBViewer Plugins-Verzeichnis und gleichzeitig dasselbe als .EXE wenn ich es debuggen möchte. Läuft einwandfrei parallel...

Edited by SnoopyDog
Link to comment

Du meinst "GetActiveObject"? Das ist nur ein simpelster Test, ob der DVBViewer überhaupt läuft. Das worauf im Endeffekt zugegriffen wird, wird in "CreateDVBViewerClasses" initialisiert.

 

Bei mir läuft allerdings ein Timer, der Anfangs versucht, "Connected" so lange zu setzen, bis es klappt. Oder man hat den richtigen Zeitpunkt (DVBViewer garantiert da), dann kann man das auch ohne Timer durchführen.

Link to comment

Ach, Du meinst zwei DVBViewer-Instanzen auf einem PC? Hatte Dich falsch verstanden. Wenn Lars mal reinschaut, kann er vielleicht etwas dazu sagen, denn ich habe das noch nicht probiert. Kann nur mit beiden Augen ein Fernsehprogramm verfolgen, zwei gleichzeitig sind mir zu viel ... :bye:

Link to comment

Ja es ist wohl so, dass sich immer nur EINE COM Schnittstelle in Windows registrieren kann und leider geht es wohl auch nicht, dass sich eine DVBViewer und die andere als DVBVIEWER2 registriert. Neh die eine Instanz soll zum aufnehmen dienen. Der HTPC im Wohnzimmer dient zum gucken und zum recorden und ein anderer im Schlafzimmer nur zum gucken und ich will eine INSTANZ immer NUR zum Aufnehmen mit einer extra Karte verwenden.

Link to comment

O.K. verstehe jetzt, warum Du 2 Instanzen laufen läßt. Kann man sich da irgendwie durchhangeln von Instanz zu Instanz? Ist nur die Frage, wie man sie auseinanderhält, falls es geht.

Link to comment
  • 4 months later...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...