2 * Copyright (c) 2018 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 NativePlaylist = Interop.MediaControllerPlaylist;
21 namespace Tizen.Multimedia.Remoting
24 /// Represents playlist for media control.
26 /// <since_tizen> 5 </since_tizen>
27 public class MediaControlPlaylist : IDisposable
29 private IntPtr _handle;
30 private Dictionary<string, MediaControlMetadata> _metadata = new Dictionary<string, MediaControlMetadata>();
33 /// Initializes a new instance of the <see cref="MediaControlPlaylist"/> class.
35 /// <param name="name">The name of this playlist.</param>
36 /// <exception cref="InvalidOperationException">An internal error occurs.</exception>
37 /// <since_tizen> 5 </since_tizen>
38 public MediaControlPlaylist(string name)
42 throw new ArgumentNullException(nameof(name));
45 NativePlaylist.CreatePlaylist(name, out IntPtr handle).ThrowIfError("Failed to create playlist");
50 MediaControlServer.SavePlaylist(handle);
54 /// Initializes a new instance of the <see cref="MediaControlPlaylist"/> class.
56 /// <param name="name">The name of this playlist.</param>
57 /// <param name="metadata">The metadata of this playlist.</param>
58 /// <exception cref="InvalidOperationException">An internal error occurs.</exception>
59 /// <since_tizen> 5 </since_tizen>
60 public MediaControlPlaylist(string name, Dictionary<string, MediaControlMetadata> metadata)
63 AddMetadata(metadata);
67 /// Initializes a new instance of the <see cref="MediaControlPlaylist"/> class with the playlist handle that created already.
69 /// <param name="handle">The handle of playlist.</param>
70 internal MediaControlPlaylist(IntPtr handle)
72 if (handle == IntPtr.Zero)
74 throw new ArgumentNullException(nameof(handle));
77 // handle will be destroyed in Native FW side.
78 Name = NativePlaylist.GetPlaylistName(handle);
80 UpdateMetadata(handle);
84 /// Finalizes an instance of the <see cref="MediaControlPlaylist"/> class.
86 /// <since_tizen> 5 </since_tizen>
87 ~MediaControlPlaylist()
92 internal IntPtr Handle
96 if (_handle == IntPtr.Zero)
98 _handle = MediaControlServer.GetPlaylistHandle(Name);
109 /// Gets or sets the name of playlist.
111 /// <since_tizen> 5 </since_tizen>
112 public string Name { get; private set; }
115 /// Gets the total number of media in this playlist.
117 public int TotalCount
121 return _metadata != null ? _metadata.Count : 0;
125 private void UpdateMetadata(IntPtr handle)
127 NativePlaylist.PlaylistItemCallback playlistItemCallback = (index, metadataHandle, _) =>
129 _metadata.Add(index, new MediaControlMetadata(metadataHandle));
132 NativePlaylist.ForeachPlaylistItem(handle, playlistItemCallback, IntPtr.Zero).
133 ThrowIfError("Failed to retrieve playlist item.");
137 /// Gets the playlist index and metadata pair.
139 /// <returns>The dictionary set of index and <see cref="MediaControlMetadata"/> pair.</returns>
140 public Dictionary<string, MediaControlMetadata> GetMetadata()
142 if (_metadata == null)
144 UpdateMetadata(Handle);
151 /// Gets the metadata by index.
153 /// <param name="index">The index of media in the playlist.</param>
154 /// <returns>A <see cref="MediaControlMetadata"/> instance.</returns>
155 public MediaControlMetadata GetMetadata(string index)
157 if (_metadata == null)
159 UpdateMetadata(Handle);
162 if (_metadata.TryGetValue(index, out MediaControlMetadata metadata))
171 /// Sets the metadata to the playlist.
173 /// <param name="metadata">The metadata of media.</param>
174 /// <since_tizen> 5 </since_tizen>
175 public void AddMetadata(Dictionary<string, MediaControlMetadata> metadata)
177 foreach (var data in metadata)
179 AddMetadata(data.Key, data.Value);
182 MediaControlServer.SavePlaylist(Handle);
186 /// Sets the metadata to the playlist.
188 /// <param name="index">The index of media in the playlist.</param>
189 /// <param name="metadata">The metadata of media.</param>
190 /// <since_tizen> 5 </since_tizen>
191 public void AddMetadata(string index, MediaControlMetadata metadata)
193 AddItemToPlaylist(index, metadata);
194 _metadata.Add(index, metadata);
196 MediaControlServer.SavePlaylist(Handle);
199 private void AddItemToPlaylist(string index, MediaControlMetadata metadata)
201 void AddMetadataToNative(string idx, MediaControllerNativeAttribute attribute, string value)
203 // This API doesn't save playlist to the storage. So we need to call MediaControlServer.SavePlaylist()
204 // after all items are updated.
205 NativePlaylist.UpdatePlaylist(Handle, idx, attribute, value)
206 .ThrowIfError("Failed to update playlist");
209 AddMetadataToNative(index, MediaControllerNativeAttribute.Album, metadata.Album);
210 AddMetadataToNative(index, MediaControllerNativeAttribute.Artist, metadata.Artist);
211 AddMetadataToNative(index, MediaControllerNativeAttribute.Author, metadata.Author);
212 AddMetadataToNative(index, MediaControllerNativeAttribute.Copyright, metadata.Copyright);
213 AddMetadataToNative(index, MediaControllerNativeAttribute.Date, metadata.Date);
214 AddMetadataToNative(index, MediaControllerNativeAttribute.Description, metadata.Description);
215 AddMetadataToNative(index, MediaControllerNativeAttribute.Duration, metadata.Duration);
216 AddMetadataToNative(index, MediaControllerNativeAttribute.Genre, metadata.Genre);
217 AddMetadataToNative(index, MediaControllerNativeAttribute.Picture, metadata.AlbumArtPath);
218 AddMetadataToNative(index, MediaControllerNativeAttribute.Title, metadata.Title);
219 AddMetadataToNative(index, MediaControllerNativeAttribute.TrackNumber, metadata.TrackNumber);
223 /// Update the playlist by lastest info.
225 /// <since_tizen> 5 </since_tizen>
228 // Update the name of playlist.
229 Name = NativePlaylist.GetPlaylistName(Handle);
232 UpdateMetadata(Handle);
235 internal void Destroy()
237 NativePlaylist.DestroyPlaylist(Handle).ThrowIfError("Failed to delete playlist");
240 #region Dispose support
241 private bool _disposed;
244 /// Releases the unmanaged resources used by the MediaControlPlaylist.
246 /// <since_tizen> 5 </since_tizen>
247 public void Dispose()
250 GC.SuppressFinalize(this);
254 /// Releases the resources used by the Recorder.
256 /// <param name="disposing">
257 /// true to release both managed and unmanaged resources; false to release only unmanaged resources.
259 /// <since_tizen> 3 </since_tizen>
260 protected virtual void Dispose(bool disposing)
264 if (_handle != IntPtr.Zero)
267 _handle = IntPtr.Zero;
273 #endregion Dispose support