1
0
mirror of https://github.com/salvadordf/CEF4Delphi.git synced 2025-02-02 10:25:26 +02:00

Update to CEF 83.5.0

This commit is contained in:
Salvador Díaz Fau 2020-07-15 14:56:41 +02:00
parent 51658e03f2
commit 882c79ac1b
18 changed files with 398 additions and 105 deletions

View File

@ -3,10 +3,10 @@ CEF4Delphi is an open source project created by Salvador Díaz Fau to embed Chro
CEF4Delphi is based on DCEF3, made by Henri Gourvest. The original license of DCEF3 still applies to CEF4Delphi. Read the license terms in the first lines of any *.pas file.
CEF4Delphi uses CEF 83.4.2 which includes Chromium 83.0.4103.106.
CEF4Delphi uses CEF 83.5.0 which includes Chromium 83.0.4103.106.
The CEF binaries used by CEF4Delphi are available for download at spotify :
* [32 bits](http://opensource.spotify.com/cefbuilds/cef_binary_83.4.2%2Bgc8d4f85%2Bchromium-83.0.4103.106_windows32.tar.bz2)
* [64 bits](http://opensource.spotify.com/cefbuilds/cef_binary_83.4.2%2Bgc8d4f85%2Bchromium-83.0.4103.106_windows64.tar.bz2)
* [32 bits](http://opensource.spotify.com/cefbuilds/cef_binary_83.5.0%2Bgbf03589%2Bchromium-83.0.4103.106_windows32.tar.bz2)
* [64 bits](http://opensource.spotify.com/cefbuilds/cef_binary_83.5.0%2Bgbf03589%2Bchromium-83.0.4103.106_windows64.tar.bz2)
CEF4Delphi was developed and tested on Delphi 10.4 and it has been tested in Delphi 7, Delphi XE, Delphi 10, Delphi 10.2, Delphi 10.3 and Lazarus 2.0.10/FPC 3.2.0. CEF4Delphi includes VCL, FireMonkey (FMX) and Lazarus components.

View File

@ -55,21 +55,43 @@ object MediaRouterFrm: TMediaRouterFrm
Left = 12
Top = 25
Width = 226
Height = 616
Height = 579
Align = alClient
ItemHeight = 13
TabOrder = 0
OnClick = SinksLbxClick
ExplicitHeight = 616
end
object SinksButtonsPnl: TPanel
Left = 12
Top = 641
Top = 604
Width = 226
Height = 74
Height = 111
Align = alBottom
BevelOuter = bvNone
Padding.Top = 10
TabOrder = 1
object GetDeviceInfoBtn: TButton
Left = 0
Top = 47
Width = 226
Height = 27
Caption = 'Get device info'
Enabled = False
TabOrder = 0
OnClick = GetDeviceInfoBtnClick
end
object NotifySinksBtn: TButton
Left = 0
Top = 84
Width = 226
Height = 27
Align = alBottom
Caption = 'Notify sinks'
TabOrder = 1
OnClick = NotifySinksBtnClick
ExplicitTop = 47
end
object CreateRouteBtn: TButton
Left = 0
Top = 10
@ -78,18 +100,9 @@ object MediaRouterFrm: TMediaRouterFrm
Align = alTop
Caption = 'Create route'
Enabled = False
TabOrder = 0
TabOrder = 2
OnClick = CreateRouteBtnClick
end
object NotifySinksBtn: TButton
Left = 0
Top = 47
Width = 226
Height = 27
Align = alBottom
Caption = 'Notify sinks'
TabOrder = 1
OnClick = NotifySinksBtnClick
ExplicitTop = 18
end
end
end
@ -125,11 +138,13 @@ object MediaRouterFrm: TMediaRouterFrm
object SourceURNLbl: TLabel
Left = 0
Top = 0
Width = 57
Height = 13
Width = 65
Height = 21
Align = alClient
Caption = 'Source URN'
Layout = tlCenter
ExplicitWidth = 57
ExplicitHeight = 13
end
end
object SourceURNCbx: TComboBox
@ -300,6 +315,7 @@ object MediaRouterFrm: TMediaRouterFrm
end
object Chromium1: TChromium
OnMediaRouteCreateFinished = Chromium1MediaRouteCreateFinished
OnMediaSinkDeviceInfo = Chromium1MediaSinkDeviceInfo
OnAfterCreated = Chromium1AfterCreated
OnBeforeClose = Chromium1BeforeClose
OnClose = Chromium1Close

View File

@ -69,7 +69,7 @@ type
SinksGbx: TGroupBox;
SinksLbx: TListBox;
SinksButtonsPnl: TPanel;
CreateRouteBtn: TButton;
GetDeviceInfoBtn: TButton;
CentralPnl: TPanel;
SourcePnl: TPanel;
SourceLblPnl: TPanel;
@ -90,6 +90,7 @@ type
ClearLogPnl: TPanel;
ClearLogBtn: TButton;
SourceURNCbx: TComboBox;
CreateRouteBtn: TButton;
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure FormCreate(Sender: TObject);
@ -104,11 +105,12 @@ type
procedure Chromium1RouteStateChanged(Sender: TObject; const route: ICefMediaRoute; state: TCefMediaRouteConnectionState);
procedure Chromium1RouteMessageReceived(Sender: TObject; const route: ICefMediaRoute; const message_: ustring);
procedure Chromium1MediaRouteCreateFinished(Sender: TObject; result: Integer; const error: ustring; const route: ICefMediaRoute);
procedure Chromium1MediaSinkDeviceInfo(Sender: TObject; const ip_address: ustring; port: Integer; const model_name: ustring);
procedure Timer1Timer(Sender: TObject);
procedure SourceURNEdtChange(Sender: TObject);
procedure SinksLbxClick(Sender: TObject);
procedure CreateRouteBtnClick(Sender: TObject);
procedure GetDeviceInfoBtnClick(Sender: TObject);
procedure TerminateRouteBtnClick(Sender: TObject);
procedure SendMsgBtnClick(Sender: TObject);
procedure NotifySinksBtnClick(Sender: TObject);
@ -116,6 +118,7 @@ type
procedure ClearLogBtnClick(Sender: TObject);
procedure MessageMemChange(Sender: TObject);
procedure RoutesLbxClick(Sender: TObject);
procedure CreateRouteBtnClick(Sender: TObject);
protected
// Variables to control when can we destroy the form safely
@ -265,6 +268,22 @@ begin
end;
end;
procedure TMediaRouterFrm.Chromium1MediaSinkDeviceInfo(Sender: TObject;
const ip_address: ustring; port: Integer; const model_name: ustring);
begin
try
FMediaCS.Acquire;
FLog.Add('Sink device info');
FLog.Add('IP address : ' + ip_address);
FLog.Add('Port : ' + inttostr(port));
FLog.Add('Model name : ' + model_name);
FLog.Add('------------------------------------------');
finally
PostMessage(Handle, MEDIA_ROUTER_PENDING_LOG_LINES, 0, 0);
FMediaCS.Release;
end;
end;
procedure TMediaRouterFrm.Chromium1RouteMessageReceived(Sender: TObject;
const route: ICefMediaRoute; const message_: ustring);
var
@ -323,6 +342,8 @@ begin
FClosing := True;
Visible := False;
DestroyAllArrays;
Chromium1.ExecuteDevToolsMethod(0, 'Cast.disable', nil);
sleep(500);
Chromium1.CloseBrowser(True);
end;
end;
@ -546,6 +567,64 @@ begin
end;
end;
procedure TMediaRouterFrm.CreateRouteBtnClick(Sender: TObject);
var
TempURN, TempErrorMsg : string;
TempSource : ICefMediaSource;
begin
TempURN := trim(SourceURNCbx.Text);
if (length(TempURN) = 0) then
begin
AddLogEntry('Invalid URN');
exit;
end;
TempErrorMsg := '';
try
try
FMediaCS.Acquire;
if (FSinks <> nil) and
(SinksLbx.Items.Count > 0) and
(SinksLbx.ItemIndex >= 0) and
(SinksLbx.ItemIndex < length(FSinks)) then
begin
TempSource := Chromium1.GetSource(TempURN);
if (TempSource <> nil) and TempSource.IsValid then
begin
if (FSinks[SinksLbx.ItemIndex].SinkIntf <> nil) and
FSinks[SinksLbx.ItemIndex].SinkIntf.IsValid then
begin
if FSinks[SinksLbx.ItemIndex].SinkIntf.IsCompatibleWith(TempSource) then
Chromium1.CreateRoute(TempSource, FSinks[SinksLbx.ItemIndex].SinkIntf)
else
TempErrorMsg := 'The selected Sink is not compatible with the Media Source.';
end
else
TempErrorMsg := 'The selected Sink is not valid.';
end
else
TempErrorMsg := 'The Media Source is not valid.';
end
else
TempErrorMsg := 'The sinks list is outdated.';
except
on e : exception do
begin
TempErrorMsg := e.Message;
if CustomExceptionHandler('TMediaRouterFrm.CreateRouteBtnClick', e) then raise;
end;
end;
finally
TempSource := nil;
FMediaCS.Release;
if (length(TempErrorMsg) > 0) then AddLogEntry(TempErrorMsg);
end;
end;
procedure TMediaRouterFrm.CopySinksArray(const aSinks : TCefMediaSinkArray);
var
i, TempLen : integer;
@ -623,61 +702,18 @@ begin
end;
end;
procedure TMediaRouterFrm.CreateRouteBtnClick(Sender: TObject);
var
TempURN, TempErrorMsg : string;
TempSource : ICefMediaSource;
procedure TMediaRouterFrm.GetDeviceInfoBtnClick(Sender: TObject);
begin
TempURN := trim(SourceURNCbx.Text);
if (length(TempURN) = 0) then
begin
AddLogEntry('Invalid URN');
exit;
end;
TempErrorMsg := '';
try
try
FMediaCS.Acquire;
FMediaCS.Acquire;
if (FSinks <> nil) and
(SinksLbx.Items.Count > 0) and
(SinksLbx.ItemIndex >= 0) and
(SinksLbx.ItemIndex < length(FSinks)) then
begin
TempSource := Chromium1.GetSource(TempURN);
if (TempSource <> nil) and TempSource.IsValid then
begin
if (FSinks[SinksLbx.ItemIndex].SinkIntf <> nil) and
FSinks[SinksLbx.ItemIndex].SinkIntf.IsValid then
begin
if FSinks[SinksLbx.ItemIndex].SinkIntf.IsCompatibleWith(TempSource) then
Chromium1.CreateRoute(TempSource, FSinks[SinksLbx.ItemIndex].SinkIntf)
else
TempErrorMsg := 'The selected Sink is not compatible with the Media Source.';
end
else
TempErrorMsg := 'The selected Sink is not valid.';
end
else
TempErrorMsg := 'The Media Source is not valid.';
end
else
TempErrorMsg := 'The sinks list is outdated.';
except
on e : exception do
begin
TempErrorMsg := e.Message;
if CustomExceptionHandler('TMediaRouterFrm.CreateRouteBtnClick', e) then raise;
end;
end;
if (FSinks <> nil) and
(SinksLbx.Items.Count > 0) and
(SinksLbx.ItemIndex >= 0) and
(SinksLbx.ItemIndex < length(FSinks)) then
Chromium1.GetDeviceInfo(FSinks[SinksLbx.ItemIndex].SinkIntf);
finally
TempSource := nil;
FMediaCS.Release;
if (length(TempErrorMsg) > 0) then AddLogEntry(TempErrorMsg);
end;
end;
@ -754,10 +790,12 @@ begin
SendMsgBtn.Enabled := TerminateRouteBtn.Enabled and
(length(trim(MessageMem.Lines.Text)) > 0);
GetDeviceInfoBtn.Enabled := (SinksLbx.ItemIndex >= 0) and
(SinksLbx.Items.Count > 0);
CreateRouteBtn.Enabled := not(TerminateRouteBtn.Enabled) and
(length(trim(SourceURNCbx.Text)) > 0) and
(SinksLbx.ItemIndex >= 0) and
(SinksLbx.Items.Count > 0);
GetDeviceInfoBtn.Enabled and
(length(trim(SourceURNCbx.Text)) > 0);
end;
procedure TMediaRouterFrm.AddLogEntry(const aMessage1, aMessage2 : string; aRec : boolean);

View File

@ -215,7 +215,8 @@ contains
uCEFLabelButtonComponent in '..\source\uCEFLabelButtonComponent.pas',
uCEFMenuButtonComponent in '..\source\uCEFMenuButtonComponent.pas',
uCEFAudioHandler in '..\source\uCEFAudioHandler.pas',
uCEFDevToolsMessageObserver in '..\source\uCEFDevToolsMessageObserver.pas';
uCEFDevToolsMessageObserver in '..\source\uCEFDevToolsMessageObserver.pas',
uCEFMediaSinkDeviceInfoCallback in '..\source\uCEFMediaSinkDeviceInfoCallback.pas';
end.

View File

@ -212,6 +212,7 @@ contains
uCEFLabelButtonComponent in '..\source\uCEFLabelButtonComponent.pas',
uCEFMenuButtonComponent in '..\source\uCEFMenuButtonComponent.pas',
uCEFAudioHandler in '..\source\uCEFAudioHandler.pas',
uCEFDevToolsMessageObserver in '..\source\uCEFDevToolsMessageObserver.pas';
uCEFDevToolsMessageObserver in '..\source\uCEFDevToolsMessageObserver.pas',
uCEFMediaSinkDeviceInfoCallback in '..\source\uCEFMediaSinkDeviceInfoCallback.pas';
end.

View File

@ -220,7 +220,8 @@ contains
uCEFLabelButtonComponent in '..\source\uCEFLabelButtonComponent.pas',
uCEFMenuButtonComponent in '..\source\uCEFMenuButtonComponent.pas',
uCEFAudioHandler in '..\source\uCEFAudioHandler.pas',
uCEFDevToolsMessageObserver in '..\source\uCEFDevToolsMessageObserver.pas';
uCEFDevToolsMessageObserver in '..\source\uCEFDevToolsMessageObserver.pas',
uCEFMediaSinkDeviceInfoCallback in '..\source\uCEFMediaSinkDeviceInfoCallback.pas';
end.

View File

@ -336,6 +336,7 @@
<DCCReference Include="..\source\uCEFMenuButtonComponent.pas"/>
<DCCReference Include="..\source\uCEFAudioHandler.pas"/>
<DCCReference Include="..\source\uCEFDevToolsMessageObserver.pas"/>
<DCCReference Include="..\source\uCEFMediaSinkDeviceInfoCallback.pas"/>
<BuildConfiguration Include="Base">
<Key>Base</Key>
</BuildConfiguration>

View File

@ -21,8 +21,8 @@
</CompilerOptions>
<Description Value="CEF4Delphi is an open source project created by Salvador Díaz Fau to embed Chromium-based browsers in applications made with Delphi or Lazarus/FPC."/>
<License Value="MPL 1.1"/>
<Version Major="83" Minor="4" Release="2"/>
<Files Count="187">
<Version Major="83" Minor="5"/>
<Files Count="188">
<Item1>
<Filename Value="..\source\uCEFAccessibilityHandler.pas"/>
<UnitName Value="uCEFAccessibilityHandler"/>
@ -787,6 +787,10 @@
<Filename Value="..\source\uCEFDevToolsMessageObserver.pas"/>
<UnitName Value="uCEFDevToolsMessageObserver"/>
</Item187>
<Item188>
<Filename Value="..\source\uCEFMediaSinkDeviceInfoCallback.pas"/>
<UnitName Value="uCEFMediaSinkDeviceInfoCallback"/>
</Item188>
</Files>
<RequiredPkgs Count="4">
<Item1>

View File

@ -62,7 +62,7 @@ uses
uCEFBrowserViewComponent, uCEFWindowComponent, uCEFPanelComponent,
uCEFScrollViewComponent, uCEFTextfieldComponent, uCEFViewComponent,
uCEFViewsFrameworkEvents, uCEFAudioHandler, uCEFDevToolsMessageObserver,
LazarusPackageIntf;
uCEFMediaSinkDeviceInfoCallback, LazarusPackageIntf;
implementation

View File

@ -61,8 +61,8 @@ uses
const
CEF_SUPPORTED_VERSION_MAJOR = 83;
CEF_SUPPORTED_VERSION_MINOR = 4;
CEF_SUPPORTED_VERSION_RELEASE = 2;
CEF_SUPPORTED_VERSION_MINOR = 5;
CEF_SUPPORTED_VERSION_RELEASE = 0;
CEF_SUPPORTED_VERSION_BUILD = 0;
CEF_CHROMEELF_VERSION_MAJOR = 83;

View File

@ -299,6 +299,7 @@ type
FOnCookieSet : TOnCookieSet;
FOnZoomPctAvailable : TOnZoomPctAvailable;
FOnMediaRouteCreateFinished : TOnMediaRouteCreateFinishedEvent;
FOnMediaSinkDeviceInfo : TOnMediaSinkDeviceInfoEvent;
{$IFDEF MSWINDOWS}
FOnBrowserCompMsg : TOnCompMsgEvent;
FOnWidgetCompMsg : TOnCompMsgEvent;
@ -612,6 +613,7 @@ type
procedure doSetZoomPct(const aValue : double); virtual;
procedure doSetZoomStep(aValue : byte); virtual;
procedure doMediaRouteCreateFinished(result: TCefMediaRouterCreateResult; const error: ustring; const route: ICefMediaRoute); virtual;
procedure doOnMediaSinkDeviceInfo(const ip_address: ustring; port: integer; const model_name: ustring); virtual;
function MustCreateAudioHandler : boolean; virtual;
function MustCreateDevToolsMessageObserver : boolean; virtual;
function MustCreateLoadHandler : boolean; virtual;
@ -779,6 +781,7 @@ type
procedure NotifyCurrentSinks;
procedure NotifyCurrentRoutes;
procedure CreateRoute(const source: ICefMediaSource; const sink: ICefMediaSink);
procedure GetDeviceInfo(const aMediaSink: ICefMediaSink);
property DefaultUrl : ustring read FDefaultUrl write FDefaultUrl;
property Options : TChromiumOptions read FOptions write FOptions;
@ -882,6 +885,7 @@ type
property OnCookieSet : TOnCookieSet read FOnCookieSet write FOnCookieSet;
property OnZoomPctAvailable : TOnZoomPctAvailable read FOnZoomPctAvailable write FOnZoomPctAvailable;
property OnMediaRouteCreateFinished : TOnMediaRouteCreateFinishedEvent read FOnMediaRouteCreateFinished write FOnMediaRouteCreateFinished;
property OnMediaSinkDeviceInfo : TOnMediaSinkDeviceInfoEvent read FOnMediaSinkDeviceInfo write FOnMediaSinkDeviceInfo;
{$IFDEF MSWINDOWS}
property OnBrowserCompMsg : TOnCompMsgEvent read FOnBrowserCompMsg write FOnBrowserCompMsg;
property OnWidgetCompMsg : TOnCompMsgEvent read FOnWidgetCompMsg write FOnWidgetCompMsg;
@ -1099,7 +1103,8 @@ uses
uCEFStringVisitor, uCEFListValue, uCEFNavigationEntryVisitor,
uCEFDownloadImageCallBack, uCEFCookieManager, uCEFRequestContextHandler,
uCEFCookieVisitor, uCEFSetCookieCallback, uCEFResourceRequestHandler,
uCEFMediaObserver, uCEFMediaRouteCreateCallback ,uCEFDevToolsMessageObserver;
uCEFMediaObserver, uCEFMediaRouteCreateCallback ,uCEFDevToolsMessageObserver,
uCEFMediaSinkDeviceInfoCallback;
constructor TChromiumCore.Create(AOwner: TComponent);
begin
@ -1681,6 +1686,7 @@ begin
FOnCookieSet := nil;
FOnZoomPctAvailable := nil;
FOnMediaRouteCreateFinished := nil;
FOnMediaSinkDeviceInfo := nil;
{$IFDEF MSWINDOWS}
FOnBrowserCompMsg := nil;
@ -4628,6 +4634,12 @@ begin
FOnMediaRouteCreateFinished(self, result, error, route);
end;
procedure TChromiumCore.doOnMediaSinkDeviceInfo(const ip_address: ustring; port: integer; const model_name: ustring);
begin
if assigned(FOnMediaSinkDeviceInfo) then
FOnMediaSinkDeviceInfo(self, ip_address, port, model_name);
end;
function TChromiumCore.MustCreateLoadHandler : boolean;
begin
Result := assigned(FOnLoadStart) or
@ -6424,6 +6436,19 @@ begin
end;
end;
procedure TChromiumCore.GetDeviceInfo(const aMediaSink: ICefMediaSink);
var
TempCallback : ICefMediaSinkDeviceInfoCallback;
begin
if (aMediaSink <> nil) then
try
TempCallback := TCefCustomMediaSinkDeviceInfoCallback.Create(self);
aMediaSink.GetDeviceInfo(TempCallback);
finally
TempCallback := nil;
end;
end;
{$IFDEF MSWINDOWS}
function TChromiumCore.CopyDCToBitmapStream(aSrcDC : HDC; const aSrcRect : TRect; var aStream : TStream) : boolean;
var

View File

@ -201,6 +201,7 @@ type
TOnCookieSet = procedure(Sender: TObject; aSuccess : boolean; aID : integer) of object;
TOnZoomPctAvailable = procedure(Sender: TObject; const aZoomPct : double) of object;
TOnMediaRouteCreateFinishedEvent = procedure(Sender: TObject; result: TCefMediaRouterCreateResult; const error: ustring; const route: ICefMediaRoute) of object;
TOnMediaSinkDeviceInfoEvent = procedure(Sender: TObject; const ip_address: ustring; port: integer; const model_name: ustring) of object;
{$IFDEF MSWINDOWS}
TOnCompMsgEvent = procedure(var aMessage: TMessage; var aHandled: Boolean) of object;
{$ENDIF}

View File

@ -149,6 +149,7 @@ type
ICefMediaRoute = interface;
ICefMediaRouteCreateCallback = interface;
ICefMediaSink = interface;
ICefMediaSinkDeviceInfoCallback = interface;
ICefMediaSource = interface;
ICefAudioHandler = interface;
ICefDevToolsMessageObserver = interface;
@ -248,7 +249,7 @@ type
TOnDownloadImageFinishedProc = {$IFDEF DELPHI12_UP}reference to{$ENDIF} procedure(const imageUrl: ustring; httpStatusCode: Integer; const image: ICefImage);
TCefCookieVisitorProc = {$IFDEF DELPHI12_UP}reference to{$ENDIF} function(const name, value, domain, path: ustring; secure, httponly, hasExpires: Boolean; const creation, lastAccess, expires: TDateTime; count, total: Integer; same_site : TCefCookieSameSite; priority : TCefCookiePriority; out deleteCookie: Boolean): Boolean;
TCefMediaRouteCreateCallbackProc = {$IFDEF DELPHI12_UP}reference to{$ENDIF} procedure(result: TCefMediaRouterCreateResult; const error: ustring; const route: ICefMediaRoute);
TCefMediaSinkDeviceInfoCallbackProc = {$IFDEF DELPHI12_UP}reference to{$ENDIF} procedure(const ip_address: ustring; port: integer; const model_name: ustring);
// *******************************************
// ************ Custom interfaces ************
@ -464,6 +465,7 @@ type
procedure doSetZoomStep(aValue : byte);
procedure doReadZoom;
procedure doMediaRouteCreateFinished(result: TCefMediaRouterCreateResult; const error: ustring; const route: ICefMediaRoute);
procedure doOnMediaSinkDeviceInfo(const ip_address: ustring; port: integer; const model_name: ustring);
function MustCreateAudioHandler : boolean;
function MustCreateLoadHandler : boolean;
function MustCreateFocusHandler : boolean;
@ -1366,18 +1368,25 @@ type
procedure OnMediaRouteCreateFinished(result: TCefMediaRouterCreateResult; const error: ustring; const route: ICefMediaRoute);
end;
//
ICefMediaSinkDeviceInfoCallback = interface(ICefBaseRefCounted)
['{633898DD-4169-45D0-ADDD-6E68B3686E0D}']
procedure OnMediaSinkDeviceInfo(const ip_address: ustring; port: integer; const model_name: ustring);
end;
// TCefMediaSink
// /include/capi/cef_media_router_capi.h (cef_media_sink_t)
ICefMediaSink = interface(ICefBaseRefCounted)
['{EDA1A4B2-2A4C-42DD-A7DF-901BF93D908D}']
function GetId: ustring;
function IsValid: boolean;
function GetName: ustring;
function GetDescription: ustring;
function GetIconType: TCefMediaSinkIconType;
function IsCastSink: boolean;
function IsDialSink: boolean;
function IsCompatibleWith(const source: ICefMediaSource): boolean;
function GetId: ustring;
function IsValid: boolean;
function GetName: ustring;
function GetDescription: ustring;
function GetIconType: TCefMediaSinkIconType;
procedure GetDeviceInfo(const callback: ICefMediaSinkDeviceInfoCallback);
function IsCastSink: boolean;
function IsDialSink: boolean;
function IsCompatibleWith(const source: ICefMediaSource): boolean;
property ID : ustring read GetId;
property Name : ustring read GetName;

View File

@ -180,7 +180,4 @@ begin
end;
end;
end.

View File

@ -54,14 +54,15 @@ uses
type
TCefMediaSinkRef = class(TCefBaseRefCountedRef, ICefMediaSink)
protected
function GetId: ustring;
function IsValid: boolean;
function GetName: ustring;
function GetDescription: ustring;
function GetIconType: TCefMediaSinkIconType;
function IsCastSink: boolean;
function IsDialSink: boolean;
function IsCompatibleWith(const source: ICefMediaSource): boolean;
function GetId: ustring;
function IsValid: boolean;
function GetName: ustring;
function GetDescription: ustring;
function GetIconType: TCefMediaSinkIconType;
procedure GetDeviceInfo(const callback: ICefMediaSinkDeviceInfoCallback);
function IsCastSink: boolean;
function IsDialSink: boolean;
function IsCompatibleWith(const source: ICefMediaSource): boolean;
public
class function UnWrap(data: Pointer): ICefMediaSink;
end;
@ -96,6 +97,11 @@ begin
Result := PCefMediaSink(FData)^.get_icon_type(PCefMediaSink(FData));
end;
procedure TCefMediaSinkRef.GetDeviceInfo(const callback: ICefMediaSinkDeviceInfoCallback);
begin
PCefMediaSink(FData)^.get_device_info(PCefMediaSink(FData), CefGetData(callback));
end;
function TCefMediaSinkRef.IsCastSink: Boolean;
begin
Result := PCefMediaSink(FData)^.is_cast_sink(PCefMediaSink(FData)) <> 0;

View File

@ -0,0 +1,177 @@
// ************************************************************************
// ***************************** CEF4Delphi *******************************
// ************************************************************************
//
// CEF4Delphi is based on DCEF3 which uses CEF to embed a chromium-based
// browser in Delphi applications.
//
// The original license of DCEF3 still applies to CEF4Delphi.
//
// For more information about CEF4Delphi visit :
// https://www.briskbard.com/index.php?lang=en&pageid=cef
//
// Copyright © 2020 Salvador Diaz Fau. All rights reserved.
//
// ************************************************************************
// ************ vvvv Original license and comments below vvvv *************
// ************************************************************************
(*
* Delphi Chromium Embedded 3
*
* Usage allowed under the restrictions of the Lesser GNU General Public License
* or alternatively the restrictions of the Mozilla Public License 1.1
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
* the specific language governing rights and limitations under the License.
*
* Unit owner : Henri Gourvest <hgourvest@gmail.com>
* Web site : http://www.progdigy.com
* Repository : http://code.google.com/p/delphichromiumembedded/
* Group : http://groups.google.com/group/delphichromiumembedded
*
* Embarcadero Technologies, Inc is not permitted to use or redistribute
* this source code without explicit permission.
*
*)
unit uCEFMediaSinkDeviceInfoCallback;
{$IFDEF FPC}
{$MODE OBJFPC}{$H+}
{$ENDIF}
{$IFNDEF CPUX64}{$ALIGN ON}{$ENDIF}
{$MINENUMSIZE 4}
{$I cef.inc}
interface
uses
uCEFBaseRefCounted, uCEFInterfaces, uCEFTypes;
type
TCefMediaSinkDeviceInfoCallbackOwn = class(TCefBaseRefCountedOwn, ICefMediaSinkDeviceInfoCallback)
protected
procedure OnMediaSinkDeviceInfo(const ip_address: ustring; port: integer; const model_name: ustring); virtual; abstract;
public
constructor Create; virtual;
end;
TCefFastMediaSinkDeviceInfoCallback = class(TCefMediaSinkDeviceInfoCallbackOwn)
protected
FCallback: TCefMediaSinkDeviceInfoCallbackProc;
procedure OnMediaSinkDeviceInfo(const ip_address: ustring; port: integer; const model_name: ustring); override;
public
constructor Create(const callback: TCefMediaSinkDeviceInfoCallbackProc); reintroduce;
destructor Destroy; override;
end;
TCefCustomMediaSinkDeviceInfoCallback = class(TCefMediaSinkDeviceInfoCallbackOwn)
protected
FEvents : Pointer;
procedure OnMediaSinkDeviceInfo(const ip_address: ustring; port: integer; const model_name: ustring); override;
public
constructor Create(const aEvents : IChromiumEvents); reintroduce;
destructor Destroy; override;
end;
implementation
uses
{$IFDEF DELPHI16_UP}
System.SysUtils,
{$ELSE}
SysUtils,
{$ENDIF}
uCEFMiscFunctions, uCEFLibFunctions, uCEFMediaSink;
procedure cef_media_sink_device_info_callback_on_media_sink_device_info(self : PCefMediaSinkDeviceInfoCallback;
device_info : PCefMediaSinkDeviceInfo); stdcall;
var
TempObject : TObject;
begin
TempObject := CefGetObject(self);
if (TempObject <> nil) and (TempObject is TCefMediaSinkDeviceInfoCallbackOwn) then
TCefMediaSinkDeviceInfoCallbackOwn(TempObject).OnMediaSinkDeviceInfo(CefString(@device_info^.ip_address),
device_info^.port,
CefString(@device_info^.model_name));
end;
// ****************************************************************
// ************** TCefMediaSinkDeviceInfoCallbackOwn **************
// ****************************************************************
constructor TCefMediaSinkDeviceInfoCallbackOwn.Create;
begin
inherited CreateData(SizeOf(TCefMediaSinkDeviceInfoCallback));
PCefMediaSinkDeviceInfoCallback(FData)^.on_media_sink_device_info :=
{$IFDEF FPC}@{$ENDIF}cef_media_sink_device_info_callback_on_media_sink_device_info;
end;
// *****************************************************************
// ************** TCefFastMediaSinkDeviceInfoCallback **************
// *****************************************************************
constructor TCefFastMediaSinkDeviceInfoCallback.Create(const callback: TCefMediaSinkDeviceInfoCallbackProc);
begin
inherited Create;
FCallback := callback;
end;
procedure TCefFastMediaSinkDeviceInfoCallback.OnMediaSinkDeviceInfo(const ip_address: ustring; port: integer; const model_name: ustring);
begin
if assigned(FCallback) then
FCallback(ip_address, port, model_name);
end;
destructor TCefFastMediaSinkDeviceInfoCallback.Destroy;
begin
FCallback := nil;
inherited Destroy;
end;
// *******************************************************************
// ************** TCefCustomMediaSinkDeviceInfoCallback **************
// *******************************************************************
constructor TCefCustomMediaSinkDeviceInfoCallback.Create(const aEvents : IChromiumEvents);
begin
inherited Create;
FEvents := Pointer(aEvents);
end;
destructor TCefCustomMediaSinkDeviceInfoCallback.Destroy;
begin
FEvents := nil;
inherited Destroy;
end;
procedure TCefCustomMediaSinkDeviceInfoCallback.OnMediaSinkDeviceInfo(const ip_address: ustring; port: integer; const model_name: ustring);
begin
try
try
if (FEvents <> nil) then
IChromiumEvents(FEvents).doOnMediaSinkDeviceInfo(ip_address, port, model_name);
except
on e : exception do
if CustomExceptionHandler('TCefCustomMediaSinkDeviceInfoCallback.OnMediaSinkDeviceInfo', e) then raise;
end;
finally
FEvents := nil;
end;
end;
end.

View File

@ -246,7 +246,9 @@ type
PCefMediaObserver = ^TCefMediaObserver;
PCefMediaSink = ^TCefMediaSink;
PPCefMediaSink = ^PCefMediaSink;
PCefMediaSinkDeviceInfoCallback = ^TCefMediaSinkDeviceInfoCallback;
PCefMediaSource = ^TCefMediaSource;
PCefMediaSinkDeviceInfo = ^TCefMediaSinkDeviceInfo;
{$IFDEF LINUX}
PXEvent = Pointer;
@ -1421,6 +1423,13 @@ type
frames_per_buffer : integer;
end;
// /include/internal/cef_types.h (cef_media_sink_device_info_t)
TCefMediaSinkDeviceInfo = record
ip_address : TCefString;
port : integer;
model_name : TCefString;
end;
// /include/capi/cef_base_capi.h (cef_base_ref_counted_t)
TCefBaseRefCounted = record
size : NativeUInt;
@ -1649,11 +1658,18 @@ type
get_name : function(self: PCefMediaSink): PCefStringUserFree; stdcall;
get_description : function(self: PCefMediaSink): PCefStringUserFree; stdcall;
get_icon_type : function(self: PCefMediaSink): TCefMediaSinkIconType; stdcall;
get_device_info : procedure(self: PCefMediaSink; callback: PCefMediaSinkDeviceInfoCallback); stdcall;
is_cast_sink : function(self: PCefMediaSink): Integer; stdcall;
is_dial_sink : function(self: PCefMediaSink): Integer; stdcall;
is_compatible_with : function(self: PCefMediaSink; source: PCefMediaSource): Integer; stdcall;
end;
// /include/capi/cef_media_router_capi.h (cef_media_sink_device_info_callback_t)
TCefMediaSinkDeviceInfoCallback = record
base : TCefBaseRefCounted;
on_media_sink_device_info : procedure(self: PCefMediaSinkDeviceInfoCallback; device_info: PCefMediaSinkDeviceInfo); stdcall;
end;
// /include/capi/cef_media_router_capi.h (cef_media_source_t)
TCefMediaSource = record
base : TCefBaseRefCounted;

View File

@ -2,9 +2,9 @@
"UpdateLazPackages" : [
{
"ForceNotify" : true,
"InternalVersion" : 160,
"InternalVersion" : 161,
"Name" : "cef4delphi_lazarus.lpk",
"Version" : "83.4.2.0"
"Version" : "83.5.0.0"
}
],
"UpdatePackageData" : {