Merge "[Player] Modified to detach sources when the resource conflict occurs." into...
[platform/core/csapi/tizenfx.git] / src / Tizen.Multimedia.MediaPlayer / Interop / Interop.Player.cs
1 /*
2  * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
3  *
4  * Licensed under the Apache License, Version 2.0 (the License);
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an AS IS BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 using System;
18 using System.Runtime.InteropServices;
19 using Tizen;
20 using Tizen.Multimedia;
21
22 internal static partial class Interop
23 {
24     internal static partial class NativePlayer
25     {
26
27         [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
28         internal delegate void PlaybackCompletedCallback(IntPtr userData);
29
30         [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
31         internal delegate void PlaybackInterruptedCallback(PlaybackInterruptionReason code, IntPtr userData);
32
33         [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
34         internal delegate void PlaybackErrorCallback(int code, IntPtr userData);
35
36         [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
37         internal delegate void VideoFrameDecodedCallback(IntPtr packetHandle, IntPtr userData);
38
39         [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
40         internal delegate void SubtitleUpdatedCallback(uint duration, string text, IntPtr userData);
41
42         [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
43         internal delegate void BufferingProgressCallback(int percent, IntPtr userData);
44
45         [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
46         internal delegate void VideoStreamChangedCallback(int width, int height, int fps, int bitrate, IntPtr userData);
47
48         [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
49         internal delegate void MediaStreamBufferStatusCallback(MediaStreamBufferStatus status, IntPtr userData);
50
51         [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
52         internal delegate void MediaStreamSeekCallback(ulong offset, IntPtr userData);
53
54         [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
55         internal delegate void VideoCaptureCallback(IntPtr data, int width, int height, uint size, IntPtr userData);
56
57         [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
58         internal delegate void PrepareCallback(IntPtr userData);
59
60         [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
61         internal delegate void SeekCompletedCallback(IntPtr userData);
62
63         [DllImport(Libraries.Player, EntryPoint = "player_create")]
64         internal static extern PlayerErrorCode Create(out PlayerHandle player);
65
66         [DllImport(Libraries.Player, EntryPoint = "player_destroy")]
67         internal static extern PlayerErrorCode Destroy(IntPtr player);
68
69         [DllImport(Libraries.Player, EntryPoint = "player_prepare")]
70         internal static extern PlayerErrorCode Prepare(IntPtr player);
71
72         [DllImport(Libraries.Player, EntryPoint = "player_unprepare")]
73         internal static extern PlayerErrorCode Unprepare(IntPtr player);
74
75         [DllImport(Libraries.Player, EntryPoint = "player_set_uri")]
76         internal static extern PlayerErrorCode SetUri(IntPtr player, string uri);
77
78         [DllImport(Libraries.Player, EntryPoint = "player_set_display")]
79         internal static extern PlayerErrorCode SetDisplay(IntPtr player, DisplayType type, IntPtr display);
80
81         [DllImport(Libraries.Player, EntryPoint = "player_start")]
82         internal static extern PlayerErrorCode Start(IntPtr player);
83
84         [DllImport(Libraries.Player, EntryPoint = "player_stop")]
85         internal static extern PlayerErrorCode Stop(IntPtr player);
86
87         [DllImport(Libraries.Player, EntryPoint = "player_pause")]
88         internal static extern PlayerErrorCode Pause(IntPtr player);
89
90         [DllImport(Libraries.Player, EntryPoint = "player_set_memory_buffer")]
91         internal static extern PlayerErrorCode SetMemoryBuffer(IntPtr player, byte[] data, int size);
92
93         [DllImport(Libraries.Player, EntryPoint = "player_get_state")]
94         internal static extern PlayerErrorCode GetState(IntPtr player, out int state);
95
96         [DllImport(Libraries.Player, EntryPoint = "player_set_volume")]
97         internal static extern PlayerErrorCode SetVolume(IntPtr player, float left, float right);
98
99         [DllImport(Libraries.Player, EntryPoint = "player_get_volume")]
100         internal static extern PlayerErrorCode GetVolume(IntPtr player, out float left, out float right);
101
102         [DllImport(Libraries.Player, EntryPoint = "player_set_sound_stream_info")]
103         internal static extern PlayerErrorCode SetAudioPolicyInfo(IntPtr player, IntPtr streamInfo);
104
105         [DllImport(Libraries.Player, EntryPoint = "player_set_audio_latency_mode")]
106         internal static extern PlayerErrorCode SetAudioLatencyMode(IntPtr player, AudioLatencyMode latencyMode);
107
108         [DllImport(Libraries.Player, EntryPoint = "player_get_audio_latency_mode")]
109         internal static extern PlayerErrorCode GetAudioLatencyMode(IntPtr player, out AudioLatencyMode latencyMode);
110
111         [DllImport(Libraries.Player, EntryPoint = "player_get_play_position")]
112         internal static extern PlayerErrorCode GetPlayPosition(IntPtr player, out int millisecond);
113
114         [DllImport(Libraries.Player, EntryPoint = "player_set_play_position")]
115         internal static extern PlayerErrorCode SetPlayPosition(IntPtr player, int millisecond,
116             bool accurate, SeekCompletedCallback cb, IntPtr userData = default(IntPtr));
117
118         [DllImport(Libraries.Player, EntryPoint = "player_set_mute")]
119         internal static extern PlayerErrorCode SetMute(IntPtr player, bool muted);
120
121         [DllImport(Libraries.Player, EntryPoint = "player_is_muted")]
122         internal static extern PlayerErrorCode IsMuted(IntPtr player, out bool muted);
123
124         [DllImport(Libraries.Player, EntryPoint = "player_set_looping")]
125         internal static extern PlayerErrorCode SetLooping(IntPtr player, bool looping);
126
127         [DllImport(Libraries.Player, EntryPoint = "player_is_looping")]
128         internal static extern PlayerErrorCode IsLooping(IntPtr player, out bool looping);
129
130         [DllImport(Libraries.Player, EntryPoint = "player_set_completed_cb")]
131         internal static extern PlayerErrorCode SetCompletedCb(IntPtr player,
132             PlaybackCompletedCallback callback, IntPtr userData = default(IntPtr));
133
134         [DllImport(Libraries.Player, EntryPoint = "player_unset_completed_cb")]
135         internal static extern PlayerErrorCode UnsetCompletedCb(IntPtr player);
136
137         [DllImport(Libraries.Player, EntryPoint = "player_set_interrupted_cb")]
138         internal static extern PlayerErrorCode SetInterruptedCb(IntPtr player,
139             PlaybackInterruptedCallback callback, IntPtr userData = default(IntPtr));
140
141         [DllImport(Libraries.Player, EntryPoint = "player_unset_interrupted_cb")]
142         internal static extern PlayerErrorCode UnsetInterruptedCb(IntPtr player);
143
144         [DllImport(Libraries.Player, EntryPoint = "player_set_error_cb")]
145         internal static extern PlayerErrorCode SetErrorCb(IntPtr player, PlaybackErrorCallback callback,
146             IntPtr userData = default(IntPtr));
147
148         [DllImport(Libraries.Player, EntryPoint = "player_unset_error_cb")]
149         internal static extern PlayerErrorCode UnsetErrorCb(IntPtr player);
150
151         [DllImport(Libraries.Player, EntryPoint = "player_capture_video")]
152         internal static extern PlayerErrorCode CaptureVideo(IntPtr player, VideoCaptureCallback callback,
153             IntPtr userData = default(IntPtr));
154
155         [DllImport(Libraries.Player, EntryPoint = "player_set_media_packet_video_frame_decoded_cb")]
156         internal static extern PlayerErrorCode SetVideoFrameDecodedCb(IntPtr player, VideoFrameDecodedCallback callback,
157             IntPtr userData = default(IntPtr));
158
159         [DllImport(Libraries.Player, EntryPoint = "player_unset_media_packet_video_frame_decoded_cb")]
160         internal static extern PlayerErrorCode UnsetVideoFrameDecodedCb(IntPtr player);
161
162         [DllImport(Libraries.Player, EntryPoint = "player_set_streaming_cookie")]
163         internal static extern PlayerErrorCode SetStreamingCookie(IntPtr player, string cookie, int size);
164
165         [DllImport(Libraries.Player, EntryPoint = "player_set_streaming_user_agent")]
166         internal static extern PlayerErrorCode SetStreamingUserAgent(IntPtr player, string userAgent, int size);
167
168         [DllImport(Libraries.Player, EntryPoint = "player_get_streaming_download_progress")]
169         internal static extern PlayerErrorCode GetStreamingDownloadProgress(IntPtr player, out int start, out int current);
170
171         [DllImport(Libraries.Player, EntryPoint = "player_set_buffering_cb")]
172         internal static extern PlayerErrorCode SetBufferingCb(IntPtr player,
173             BufferingProgressCallback callback, IntPtr userData = default(IntPtr));
174
175         [DllImport(Libraries.Player, EntryPoint = "player_unset_buffering_cb")]
176         internal static extern PlayerErrorCode UnsetBufferingCb(IntPtr player);
177
178         [DllImport(Libraries.Player, EntryPoint = "player_set_playback_rate")]
179         internal static extern PlayerErrorCode SetPlaybackRate(IntPtr player, float rate);
180
181         [DllImport(Libraries.Player, EntryPoint = "player_push_media_stream")]
182         internal static extern PlayerErrorCode PushMediaStream(IntPtr player, IntPtr packet);
183
184         [DllImport(Libraries.Player, EntryPoint = "player_set_media_stream_info")]
185         internal static extern PlayerErrorCode SetMediaStreamInfo(IntPtr player, int type, IntPtr format);
186
187         [DllImport(Libraries.Player, EntryPoint = "player_set_media_stream_buffer_status_cb")]
188         internal static extern PlayerErrorCode SetMediaStreamBufferStatusCb(IntPtr player, StreamType type,
189             MediaStreamBufferStatusCallback callback, IntPtr userData = default(IntPtr));
190
191         [DllImport(Libraries.Player, EntryPoint = "player_unset_media_stream_buffer_status_cb")]
192         internal static extern PlayerErrorCode UnsetMediaStreamBufferStatusCb(IntPtr player, int type);
193
194         [DllImport(Libraries.Player, EntryPoint = "player_set_media_stream_seek_cb")]
195         internal static extern PlayerErrorCode SetMediaStreamSeekCb(IntPtr player, StreamType type,
196             MediaStreamSeekCallback callback, IntPtr userData = default(IntPtr));
197
198         [DllImport(Libraries.Player, EntryPoint = "player_unset_media_stream_seek_cb")]
199         internal static extern PlayerErrorCode UnsetMediaStreamSeekCb(IntPtr player, int type);
200
201         [DllImport(Libraries.Player, EntryPoint = "player_set_media_stream_buffer_max_size")]
202         internal static extern PlayerErrorCode SetMediaStreamBufferMaxSize(IntPtr player, StreamType type, ulong maxSize);
203
204         [DllImport(Libraries.Player, EntryPoint = "player_get_media_stream_buffer_max_size")]
205         internal static extern PlayerErrorCode GetMediaStreamBufferMaxSize(IntPtr player, StreamType type, out ulong maxSize);
206
207         [DllImport(Libraries.Player, EntryPoint = "player_set_media_stream_buffer_min_threshold")]
208         internal static extern PlayerErrorCode SetMediaStreamBufferMinThreshold(IntPtr player, StreamType type, uint percent);
209
210         [DllImport(Libraries.Player, EntryPoint = "player_get_media_stream_buffer_min_threshold")]
211         internal static extern PlayerErrorCode GetMediaStreamBufferMinThreshold(IntPtr player, int type, out uint percent);
212
213         [DllImport(Libraries.Player, EntryPoint = "player_get_content_info")]
214         internal static extern PlayerErrorCode GetContentInfo(IntPtr player, StreamMetadataKey key, out IntPtr value);
215
216         [DllImport(Libraries.Player, EntryPoint = "player_get_codec_info")]
217         internal static extern PlayerErrorCode GetCodecInfo(IntPtr player, out IntPtr audioCodec, out IntPtr videoCodec);
218
219         [DllImport(Libraries.Player, EntryPoint = "player_get_audio_stream_info")]
220         internal static extern PlayerErrorCode GetAudioStreamInfo(IntPtr player, out int sampleRate, out int channel, out int bitRate);
221
222         [DllImport(Libraries.Player, EntryPoint = "player_get_video_stream_info")]
223         internal static extern PlayerErrorCode GetVideoStreamInfo(IntPtr player, out int fps, out int bitRate);
224
225         [DllImport(Libraries.Player, EntryPoint = "player_get_album_art")]
226         internal static extern PlayerErrorCode GetAlbumArt(IntPtr player, out IntPtr albumArt, out int size);
227
228         [DllImport(Libraries.Player, EntryPoint = "player_get_video_size")]
229         internal static extern PlayerErrorCode GetVideoSize(IntPtr player, out int width, out int height);
230
231         [DllImport(Libraries.Player, EntryPoint = "player_get_duration")]
232         internal static extern PlayerErrorCode GetDuration(IntPtr player, out int duration);
233
234         [DllImport(Libraries.Player, EntryPoint = "player_set_subtitle_path")]
235         internal static extern PlayerErrorCode SetSubtitlePath(IntPtr player, string path);
236
237         [DllImport(Libraries.Player, EntryPoint = "player_set_subtitle_updated_cb")]
238         internal static extern PlayerErrorCode SetSubtitleUpdatedCb(IntPtr player,
239             SubtitleUpdatedCallback callback, IntPtr userData = default(IntPtr));
240
241         [DllImport(Libraries.Player, EntryPoint = "player_unset_subtitle_updated_cb")]
242         internal static extern PlayerErrorCode UnsetSubtitleUpdatedCb(IntPtr player);
243
244         [DllImport(Libraries.Player, EntryPoint = "player_set_subtitle_position_offset")]
245         internal static extern PlayerErrorCode SetSubtitlePositionOffset(IntPtr player, int millisecond);
246
247         [DllImport(Libraries.Player, EntryPoint = "player_set_video_stream_changed_cb")]
248         internal static extern PlayerErrorCode SetVideoStreamChangedCb(IntPtr player,
249             VideoStreamChangedCallback callback, IntPtr userData = default(IntPtr));
250
251         [DllImport(Libraries.Player, EntryPoint = "player_unset_video_stream_changed_cb")]
252         internal static extern PlayerErrorCode UnsetVideoStreamChangedCb(IntPtr player);
253
254         [DllImport(Libraries.Player, EntryPoint = "player_get_track_count")]
255         internal static extern PlayerErrorCode GetTrackCount(IntPtr player, int type, out int count);
256
257         [DllImport(Libraries.Player, EntryPoint = "player_select_track")]
258         internal static extern PlayerErrorCode SelectTrack(IntPtr player, int type, int index);
259
260         [DllImport(Libraries.Player, EntryPoint = "player_get_current_track")]
261         internal static extern PlayerErrorCode GetCurrentTrack(IntPtr player, int type, out int index);
262
263         [DllImport(Libraries.Player, EntryPoint = "player_get_track_language_code")]
264         internal static extern PlayerErrorCode GetTrackLanguageCode(IntPtr player, int type, int index, out IntPtr code);
265     }
266
267     internal class PlayerHandle : SafeHandle
268     {
269         protected PlayerHandle() : base(IntPtr.Zero, true)
270         {
271         }
272
273         public override bool IsInvalid => handle == IntPtr.Zero;
274
275         protected override bool ReleaseHandle()
276         {
277             var ret = NativePlayer.Destroy(handle);
278             if (ret != PlayerErrorCode.None)
279             {
280                 Log.Debug(GetType().FullName, $"Failed to release native {GetType().Name}");
281                 return false;
282             }
283
284             return true;
285         }
286     }
287 }