Skip to content

Commit ff06d32

Browse files
committed
mediaplayer: Add record binding
1 parent cf7fa94 commit ff06d32

File tree

3 files changed

+85
-0
lines changed

3 files changed

+85
-0
lines changed

src/LibVLCSharp/Events/MediaPlayerEventManager.cs

+17
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ internal class MediaPlayerEventManager : EventManager
3737
EventHandler<MediaPlayerProgramDeletedEventArgs>? _mediaPlayerProgramDeleted;
3838
EventHandler<MediaPlayerProgramSelectedEventArgs>? _mediaPlayerProgramSelected;
3939
EventHandler<MediaPlayerProgramUpdatedEventArgs>? _mediaPlayerProgramUpdated;
40+
EventHandler<MediaPlayerRecordChangedEventArgs>? _mediaplayerRecordChanged;
4041

4142
public MediaPlayerEventManager(IntPtr ptr) : base(ptr)
4243
{
@@ -174,6 +175,10 @@ protected internal override void AttachEvent<T>(EventType eventType, EventHandle
174175
_mediaPlayerProgramSelected += eventHandler as EventHandler<MediaPlayerProgramSelectedEventArgs>;
175176
Attach(eventType, OnProgramSelected);
176177
break;
178+
case EventType.MediaPlayerRecordChanged:
179+
_mediaplayerRecordChanged += eventHandler as EventHandler<MediaPlayerRecordChangedEventArgs>;
180+
Attach(eventType, OnRecordChanged);
181+
break;
177182
default:
178183
OnEventUnhandled(this, eventType);
179184
break;
@@ -312,6 +317,10 @@ protected internal override void DetachEvent<T>(EventType eventType, EventHandle
312317
_mediaPlayerProgramSelected -= eventHandler as EventHandler<MediaPlayerProgramSelectedEventArgs>;
313318
Detach(eventType);
314319
break;
320+
case EventType.MediaPlayerRecordChanged:
321+
_mediaplayerRecordChanged -= eventHandler as EventHandler<MediaPlayerRecordChangedEventArgs>;
322+
Detach(eventType);
323+
break;
315324
default:
316325
OnEventUnhandled(this, eventType);
317326
break;
@@ -503,5 +512,13 @@ void OnProgramSelected(IntPtr ptr)
503512
_mediaPlayerProgramSelected?.Invoke(this,
504513
new MediaPlayerProgramSelectedEventArgs(selectionChanged.UnselectedId, selectionChanged.SelectedId));
505514
}
515+
516+
void OnRecordChanged(IntPtr ptr)
517+
{
518+
var recordChanged = RetrieveEvent(ptr).Union.RecordChanged;
519+
520+
_mediaplayerRecordChanged?.Invoke(this,
521+
new MediaPlayerRecordChangedEventArgs(recordChanged.IsRecording, recordChanged.RecordedFilePath.FromUtf8()));
522+
}
506523
}
507524
}

src/LibVLCSharp/LibVLCEvents.cs

+33
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ internal enum EventType
5353
MediaPlayerTitleListChanged,
5454
MediaPlayerTitleSelectionChanged,
5555
MediaPlayerChapterChanged,
56+
MediaPlayerRecordChanged,
5657
MediaListItemAdded = 0x200,
5758
MediaListWillAddItem,
5859
MediaListItemDeleted,
@@ -161,6 +162,8 @@ internal readonly struct EventUnion
161162
internal readonly VolumeChanged MediaPlayerVolumeChanged;
162163
[FieldOffset(0)]
163164
internal readonly AudioDeviceChanged AudioDeviceChanged;
165+
[FieldOffset(0)]
166+
internal readonly RecordChanged RecordChanged;
164167

165168
// renderer discoverer
166169
[FieldOffset(0)]
@@ -296,6 +299,13 @@ internal readonly struct AudioDeviceChanged
296299
internal readonly IntPtr Device;
297300
}
298301

302+
[StructLayout(LayoutKind.Sequential)]
303+
internal readonly struct RecordChanged
304+
{
305+
internal readonly bool IsRecording;
306+
internal readonly IntPtr RecordedFilePath;
307+
}
308+
299309
[StructLayout(LayoutKind.Sequential)]
300310
internal readonly struct MediaPlayerMediaChanged
301311
{
@@ -807,6 +817,29 @@ internal MediaPlayerProgramSelectedEventArgs(int unselectedId, int selectedId)
807817
}
808818
}
809819

820+
/// <summary>
821+
/// The mediaplayer started or stopped recording
822+
/// </summary>
823+
public class MediaPlayerRecordChangedEventArgs : EventArgs
824+
{
825+
/// <summary>
826+
/// True if the mediaplayer started recording,
827+
/// false when the mediaplayer stopped recording
828+
/// </summary>
829+
public readonly bool IsRecording;
830+
831+
/// <summary>
832+
/// filepath of the recorded file, only valid when <see cref="IsRecording"/> is false
833+
/// </summary>
834+
public readonly string? FilePath;
835+
836+
internal MediaPlayerRecordChangedEventArgs(bool isRecording, string? filePath)
837+
{
838+
IsRecording = isRecording;
839+
FilePath = filePath;
840+
}
841+
}
842+
810843
#endregion
811844

812845
#region MediaList events

src/LibVLCSharp/MediaPlayer.cs

+35
Original file line numberDiff line numberDiff line change
@@ -559,6 +559,11 @@ internal static extern int LibVLCMediaPlayerAddSlave(IntPtr mediaPlayer, MediaSl
559559
internal static extern bool LibVLCVideoSetOutputCallbacks(IntPtr mediaplayer, VideoEngine engine, OutputSetup? outputSetup,
560560
OutputCleanup? outputCleanup, OutputSetResize? resize, UpdateOutput updateOutput, Swap swap, MakeCurrent makeCurrent,
561561
GetProcAddress? getProcAddress, FrameMetadata? metadata, OutputSelectPlane? selectPlane, IntPtr opaque);
562+
563+
[DllImport(Constants.LibraryName, CallingConvention = CallingConvention.Cdecl,
564+
EntryPoint = "libvlc_media_player_record")]
565+
internal static extern void LibVLCMediaPlayerRecord(IntPtr mediaplayer, bool enable, IntPtr path);
566+
562567
#if ANDROID
563568
[DllImport(Constants.LibraryName, CallingConvention = CallingConvention.Cdecl,
564569
EntryPoint = "libvlc_media_player_set_android_context")]
@@ -2067,6 +2072,27 @@ public bool SetOutputCallbacks(VideoEngine engine, OutputSetup? outputSetup, Out
20672072
FrameMetadata? _frameMetadata;
20682073
OutputSelectPlane? _outputSelectPlane;
20692074

2075+
/// <summary>
2076+
/// Start recording
2077+
/// <para/>
2078+
/// Users should subscribe to <see cref="MediaPlayer.RecordChanged"/> beforehand to get the final filepath of the recorded file and
2079+
/// monitor the recording state.
2080+
/// <para/>
2081+
/// LibVLC 4.0 and later
2082+
/// </summary>
2083+
/// <param name="directory">path of the recording directory or NULL (use default path)</param>
2084+
public void StartRecording(string? directory = null) => Native.LibVLCMediaPlayerRecord(NativeReference, enable: true, directory.ToUtf8());
2085+
2086+
/// <summary>
2087+
/// Stop recording
2088+
/// <para/>
2089+
/// Users should subscribe to <see cref="MediaPlayer.RecordChanged"/> beforehand to get the final filepath of the recorded file and
2090+
/// monitor the recording state.
2091+
/// <para/>
2092+
/// LibVLC 4.0 and later
2093+
/// </summary>
2094+
public void StopRecording() => Native.LibVLCMediaPlayerRecord(NativeReference, enable: false, IntPtr.Zero);
2095+
20702096
readonly MediaConfiguration Configuration = new MediaConfiguration();
20712097

20722098
#if UNITY
@@ -3003,6 +3029,15 @@ public event EventHandler<MediaPlayerProgramSelectedEventArgs> ProgramSelected
30033029
add => EventManager.AttachEvent(EventType.MediaPlayerProgramSelected, value);
30043030
remove => EventManager.DetachEvent(EventType.MediaPlayerProgramSelected, value);
30053031
}
3032+
3033+
/// <summary>
3034+
/// The recording state of the mediaplayer changed
3035+
/// </summary>
3036+
public event EventHandler<MediaPlayerRecordChangedEventArgs> RecordChanged
3037+
{
3038+
add => EventManager.AttachEvent(EventType.MediaPlayerRecordChanged, value);
3039+
remove => EventManager.DetachEvent(EventType.MediaPlayerRecordChanged, value);
3040+
}
30063041
#endregion
30073042

30083043
/// <summary>

0 commit comments

Comments
 (0)