2 * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
18 using System.Collections.Generic;
19 using System.Threading.Tasks;
20 using Tizen.Applications;
22 namespace Tizen.Multimedia.MediaController
26 /// The MediaControllerClient class provides APIs required for media-controller-client.
29 /// http://tizen.org/privilege/mediacontroller.client
\r
32 /// The MediaControllerClient APIs provides functions to get media information from server.
34 public class MediaControllerClient : IDisposable
36 internal IntPtr _handle = IntPtr.Zero;
38 private bool _disposed = false;
39 private EventHandler<ServerUpdatedEventArgs> _serverUpdated;
40 private Interop.MediaControllerClient.ServerUpdatedCallback _serverUpdatedCallback;
41 private EventHandler<PlaybackUpdatedEventArgs> _playbackUpdated;
42 private Interop.MediaControllerClient.PlaybackUpdatedCallback _playbackUpdatedCallback;
43 private EventHandler<MetadataUpdatedEventArgs> _metadataUpdated;
44 private Interop.MediaControllerClient.MetadataUpdatedCallback _metadataUpdatedCallback;
45 private EventHandler<ShuffleModeUpdatedEventArgs> _shufflemodeUpdated;
46 private Interop.MediaControllerClient.ShuffleModeUpdatedCallback _shufflemodeUpdatedCallback;
47 private EventHandler<RepeatModeUpdatedEventArgs> _repeatmodeUpdated;
48 private Interop.MediaControllerClient.RepeatModeUpdatedCallback _repeatmodeUpdatedCallback;
49 private EventHandler<CustomCommandReplyEventArgs> _customcommandReply;
50 private Interop.MediaControllerClient.CommandReplyRecievedCallback _customcommandReplyCallback;
53 /// The constructor of MediaControllerClient class.
55 /// <exception cref="InvalidOperationException">Thrown when the operation is invalid for the current state</exception>
56 /// <exception cref="UnauthorizedAccessException">Thrown when the access is denied for media controller client</exception>
57 public MediaControllerClient ()
59 MediaControllerValidator.ThrowIfError(
60 Interop.MediaControllerClient.Create(out _handle), "Create client failed");
63 ~MediaControllerClient ()
71 GC.SuppressFinalize(this);
74 protected virtual void Dispose(bool disposing)
80 // To be used if there are any other disposable objects
82 if(_handle != IntPtr.Zero)
84 Interop.MediaControllerClient.Destroy(_handle);
85 _handle = IntPtr.Zero;
92 /// ServerUpdated event is raised when server is changed
94 public event EventHandler<ServerUpdatedEventArgs> ServerUpdated
98 if(_serverUpdated == null)
100 RegisterServerUpdatedEvent();
102 _serverUpdated += value;
107 _serverUpdated -= value;
108 if(_serverUpdated == null)
110 UnregisterServerUpdatedEvent();
116 /// PlaybackUpdated event is raised when playback is changed
118 public event EventHandler<PlaybackUpdatedEventArgs> PlaybackUpdated
122 if(_playbackUpdated == null)
124 RegisterPlaybackUpdatedEvent();
126 _playbackUpdated += value;
131 _playbackUpdated -= value;
132 if(_playbackUpdated == null)
134 UnregisterPlaybackUpdatedEvent();
140 /// MetadataUpdated event is raised when metadata is changed
142 public event EventHandler<MetadataUpdatedEventArgs> MetadataUpdated
146 if(_metadataUpdated == null)
148 RegisterMetadataUpdatedEvent();
150 _metadataUpdated += value;
155 _metadataUpdated -= value;
156 if(_metadataUpdated == null)
158 UnregisterMetadataUpdatedEvent();
164 /// ShuffleModeUpdated event is raised when shuffle mode is changed
166 public event EventHandler<ShuffleModeUpdatedEventArgs> ShuffleModeUpdated
170 if(_shufflemodeUpdated == null)
172 RegisterShuffleModeUpdatedEvent();
174 _shufflemodeUpdated += value;
179 _shufflemodeUpdated -= value;
180 if(_shufflemodeUpdated == null)
182 UnregisterShuffleModeUpdatedEvent();
188 /// RepeatModeUpdated event is raised when server is changed
190 public event EventHandler<RepeatModeUpdatedEventArgs> RepeatModeUpdated
194 if(_repeatmodeUpdated == null)
196 RegisterRepeatModeUpdatedEvent();
198 _repeatmodeUpdated += value;
203 _repeatmodeUpdated -= value;
204 if(_repeatmodeUpdated == null)
206 UnregisterRepeatModeUpdatedEvent();
212 /// CommandReply event is raised when reply for command is recieved
214 public event EventHandler<CustomCommandReplyEventArgs> CustomCommandReply
218 if(_customcommandReply == null)
220 _customcommandReplyCallback = (string serverName, int result, IntPtr bundle, IntPtr userData) =>
222 SafeBundleHandle bundleHandle = new SafeBundleHandle(bundle, true);
223 Applications.Bundle _bundle = new Bundle(bundleHandle);
224 CustomCommandReplyEventArgs eventArgs = new CustomCommandReplyEventArgs(serverName, result, _bundle);
225 _customcommandReply?.Invoke(this, eventArgs);
228 _customcommandReply += value;
233 _customcommandReply -= value;
234 if(_customcommandReply == null)
236 _customcommandReplyCallback = null;
242 /// gets latest server information </summary>
243 /// <returns>The name and state of the latest media controller server application: ServerInformation object</returns>
244 /// <exception cref="InvalidOperationException">Thrown when the operation is invalid for the current state</exception>
245 public ServerInformation GetLatestServer()
248 MediaControllerServerState _state = MediaControllerServerState.None;
250 MediaControllerValidator.ThrowIfError(
\r
251 Interop.MediaControllerClient.GetLatestServer(_handle, out _name, out _state), "Get Latest server failed");
\r
253 return new ServerInformation(_name, (MediaControllerServerState)_state);
\r
257 /// gets playback information for specific server </summary>
258 /// <param name="serverName"> Server Name </param>
259 /// <returns>The playback state and playback position of the specific media controller server application:MediaControllerPlayback object</returns>
260 /// <exception cref="ArgumentException">Thrown when an invalid argument is used</exception>
261 /// <exception cref="InvalidOperationException">Thrown when the operation is invalid for the current state</exception>
262 public MediaControllerPlayback GetPlayback(String serverName)
264 IntPtr _playbackHandle = IntPtr.Zero;
266 MediaControllerValidator.ThrowIfError(
267 Interop.MediaControllerClient.GetServerPlayback(_handle, serverName, out _playbackHandle), "Get Playback handle failed");
269 return new MediaControllerPlayback (_playbackHandle);
273 /// gets metadata information for specific server </summary>
274 /// <param name="serverName"> Server Name </param>
275 /// <returns>The metadata information of the specific media controller server application:MediaControllerMetadata object</returns>
276 /// <exception cref="ArgumentException">Thrown when an invalid argument is used</exception>
277 /// <exception cref="InvalidOperationException">Thrown when the operation is invalid for the current state</exception>
278 public MediaControllerMetadata GetMetadata(String serverName)
280 IntPtr _metadataHandle = IntPtr.Zero;
282 MediaControllerValidator.ThrowIfError(
283 Interop.MediaControllerClient.GetServerMetadata(_handle, serverName, out _metadataHandle), "Get Metadata handle failed");
285 return new MediaControllerMetadata (_metadataHandle);
289 /// gets shuffle mode for specific server </summary>
290 /// <param name="serverName"> Server Name </param>
291 /// <returns>The shuffle mode of the specific media controller server application:MediaControllerShuffleMode enum</returns>
292 /// <exception cref="ArgumentException">Thrown when an invalid argument is used</exception>
293 /// <exception cref="InvalidOperationException">Thrown when the operation is invalid for the current state</exception>
294 public MediaControllerShuffleMode GetShuffleMode(String serverName)
296 MediaControllerShuffleMode _shuffleMode = MediaControllerShuffleMode.Off;
298 MediaControllerValidator.ThrowIfError(
299 Interop.MediaControllerClient.GetServerShuffleMode(_handle, serverName, out _shuffleMode), "Get ShuffleMode failed");
305 /// gets repeat mode for specific server </summary>
306 /// <param name="serverName"> Server Name </param>
307 /// <returns>The repeat mode of the specific media controller server application:MediaControllerRepeatMode enum</returns>
308 /// <exception cref="ArgumentException">Thrown when an invalid argument is used</exception>
309 /// <exception cref="InvalidOperationException">Thrown when the operation is invalid for the current state</exception>
310 public MediaControllerRepeatMode GetRepeatMode(String serverName)
312 MediaControllerRepeatMode _repeatMode = MediaControllerRepeatMode.Off;
314 MediaControllerValidator.ThrowIfError(
315 Interop.MediaControllerClient.GetServerRepeatMode(_handle, serverName, out _repeatMode), "Get RepeatMode failed");
321 /// Send command of playback state to server application </summary>
322 /// <param name="serverName"> Server Name </param>
323 /// <param name="state"> Playback State </param>
324 /// <exception cref="ArgumentException">Thrown when an invalid argument is used</exception>
325 /// <exception cref="InvalidOperationException">Thrown when the operation is invalid for the current state</exception>
326 public void SendPlaybackStateCommand(string serverName, MediaControllerPlaybackState state)
328 MediaControllerValidator.ThrowIfError(
329 Interop.MediaControllerClient.SendPlaybackStateCommand(_handle, serverName, state), "Send playback state command failed");
333 /// Send customized command to server application </summary>
334 /// <param name="serverName"> Server Name </param>
335 /// <param name="command"> Command </param>
336 /// <param name="bundle"> Bundle data </param>
337 /// <exception cref="ArgumentException">Thrown when an invalid argument is used</exception>
338 /// <exception cref="InvalidOperationException">Thrown when the operation is invalid for the current state</exception>
339 public void SendCustomCommand(string serverName, string command, Bundle bundle)
341 MediaControllerValidator.ThrowIfError(
342 Interop.MediaControllerClient.SendCustomCommand(_handle, serverName, command, bundle.SafeBundleHandle, _customcommandReplyCallback, IntPtr.Zero),
343 "Send custom command failed");
347 /// Subscribe subscription type from specific server application </summary>
348 /// <param name="type"> Subscription Type </param>
349 /// <param name="serverName"> Server Name </param>
350 /// <exception cref="ArgumentException">Thrown when an invalid argument is used</exception>
351 public void Subscribe(MediaControllerSubscriptionType type, string serverName)
353 MediaControllerValidator.ThrowIfError(
354 Interop.MediaControllerClient.Subscribe(_handle, type, serverName), "Subscribe failed");
358 /// Subscribe subscription type from specific server application </summary>
359 /// <param name="type"> Subscription Type </param>
360 /// <param name="serverName"> Server Name </param>
361 /// <exception cref="ArgumentException">Thrown when an invalid argument is used</exception>
362 public void Unsubscribe(MediaControllerSubscriptionType type, string serverName)
364 MediaControllerValidator.ThrowIfError(
365 Interop.MediaControllerClient.Unsubscribe(_handle, type, serverName), "Unsubscribe failed");
369 /// gets activated server list </summary>
370 /// <returns>The list of activated media controller server applications: IEnumerable of string</returns>
371 public Task<IEnumerable<string>> GetActivatedServerList()
373 var task = new TaskCompletionSource<IEnumerable<string>>();
375 List<string> collectionList = ForEachActivatedServer(_handle);
376 task.TrySetResult((IEnumerable<string>)collectionList);
382 /// gets subscribed server list </summary>
383 /// <param name="subscriptionType"> Subscription Type </param>
384 /// <returns>The list of subscribed media controller server applications: IEnumerable of string</returns>
385 /// <exception cref="ArgumentException">Thrown when an invalid argument is used</exception>
386 /// <exception cref="InvalidOperationException">Thrown when the operation is invalid for the current state</exception>
387 public Task<IEnumerable<string>> GetSubscribedServerList(MediaControllerSubscriptionType subscriptionType)
389 var task = new TaskCompletionSource<IEnumerable<string>>();
391 List<string> collectionList = ForEachSubscribedServer(_handle, subscriptionType);
392 task.TrySetResult((IEnumerable<string>)collectionList);
397 private void RegisterServerUpdatedEvent()
399 _serverUpdatedCallback = (string serverName, MediaControllerServerState serverState, IntPtr userData) =>
401 ServerUpdatedEventArgs eventArgs = new ServerUpdatedEventArgs(serverName, serverState);
402 _serverUpdated?.Invoke(this, eventArgs);
404 Interop.MediaControllerClient.SetServerUpdatedCb(_handle, _serverUpdatedCallback, IntPtr.Zero);
407 private void UnregisterServerUpdatedEvent()
409 Interop.MediaControllerClient.UnsetServerUpdatedCb(_handle);
412 private void RegisterPlaybackUpdatedEvent()
414 _playbackUpdatedCallback = (string serverName, IntPtr playback, IntPtr userData) =>
416 PlaybackUpdatedEventArgs eventArgs = new PlaybackUpdatedEventArgs(serverName, playback);
417 _playbackUpdated?.Invoke(this, eventArgs);
419 Interop.MediaControllerClient.SetPlaybackUpdatedCb(_handle, _playbackUpdatedCallback, IntPtr.Zero);
422 private void UnregisterPlaybackUpdatedEvent()
424 Interop.MediaControllerClient.UnsetPlaybackUpdatedCb(_handle);
427 private void RegisterMetadataUpdatedEvent()
429 _metadataUpdatedCallback = (string serverName, IntPtr metadata, IntPtr userData) =>
431 MetadataUpdatedEventArgs eventArgs = new MetadataUpdatedEventArgs(serverName, metadata);
432 _metadataUpdated?.Invoke(this, eventArgs);
434 Interop.MediaControllerClient.SetMetadataUpdatedCb(_handle, _metadataUpdatedCallback, IntPtr.Zero);
437 private void UnregisterMetadataUpdatedEvent()
439 Interop.MediaControllerClient.UnsetMetadataUpdatedCb(_handle);
442 private void RegisterShuffleModeUpdatedEvent()
444 _shufflemodeUpdatedCallback = (string serverName, MediaControllerShuffleMode shuffleMode, IntPtr userData) =>
446 ShuffleModeUpdatedEventArgs eventArgs = new ShuffleModeUpdatedEventArgs(serverName, shuffleMode);
447 _shufflemodeUpdated?.Invoke(this, eventArgs);
450 MediaControllerValidator.ThrowIfError(
451 Interop.MediaControllerClient.SetShuffleModeUpdatedCb(_handle, _shufflemodeUpdatedCallback, IntPtr.Zero),
452 "Set ShuffleModeUpdated callback failed");
455 private void UnregisterShuffleModeUpdatedEvent()
457 Interop.MediaControllerClient.UnsetShuffleModeUpdatedCb(_handle);
460 private void RegisterRepeatModeUpdatedEvent()
462 _repeatmodeUpdatedCallback = (string serverName, MediaControllerRepeatMode repeatMode, IntPtr userData) =>
464 RepeatModeUpdatedEventArgs eventArgs = new RepeatModeUpdatedEventArgs(serverName, repeatMode);
465 _repeatmodeUpdated?.Invoke(this, eventArgs);
468 MediaControllerValidator.ThrowIfError(
469 Interop.MediaControllerClient.SetRepeatModeUpdatedCb(_handle, _repeatmodeUpdatedCallback, IntPtr.Zero),
470 "Set RepeatModeUpdated callback failed");
473 private void UnregisterRepeatModeUpdatedEvent()
475 Interop.MediaControllerClient.UnsetRepeatModeUpdatedCb(_handle);
478 private static List<string> ForEachSubscribedServer(IntPtr handle, MediaControllerSubscriptionType subscriptionType)
480 List<string> subscribedServerCollections = new List<string>();
482 Interop.MediaControllerClient.SubscribedServerCallback serverCallback = (string serverName, IntPtr userData) =>
484 subscribedServerCollections.Add (serverName);
488 MediaControllerValidator.ThrowIfError(
489 Interop.MediaControllerClient.ForeachSubscribedServer(handle, subscriptionType, serverCallback, IntPtr.Zero),
490 "Foreach Subscribed server failed");
492 return subscribedServerCollections;
495 private static List<string> ForEachActivatedServer(IntPtr handle)
497 List<string> activatedServerCollections = new List<string>();
499 Interop.MediaControllerClient.ActivatedServerCallback serverCallback = (string serverName, IntPtr userData) =>
501 activatedServerCollections.Add(serverName);
\r
505 MediaControllerValidator.ThrowIfError(
506 Interop.MediaControllerClient.ForeachActivatedServer(handle, serverCallback, IntPtr.Zero),
507 "Foreach Activated server failed");
509 return activatedServerCollections;