diff --git a/src/Tizen.Multimedia.AudioIO/Interop/Interop.WavPlayer.cs b/src/Tizen.Multimedia.AudioIO/Interop/Interop.WavPlayer.cs index 0712ee1c430..7c7299690e5 100644 --- a/src/Tizen.Multimedia.AudioIO/Interop/Interop.WavPlayer.cs +++ b/src/Tizen.Multimedia.AudioIO/Interop/Interop.WavPlayer.cs @@ -29,6 +29,10 @@ internal static partial class WavPlayer internal static extern WavPlayerError Start(string filePath, AudioStreamPolicyHandle streamInfoHandle, WavPlayerCompletedCallback completedCallback, IntPtr userData, out int id); + [DllImport(Libraries.WavPlayer, EntryPoint = "wav_player_start_loop")] + internal static extern WavPlayerError StartLoop(string filePath, AudioStreamPolicyHandle streamInfoHandle, uint count, + WavPlayerCompletedCallback completedCallback, IntPtr userData, out int id); + [DllImport(Libraries.WavPlayer, EntryPoint = "wav_player_stop")] internal static extern WavPlayerError Stop(int id); } diff --git a/src/Tizen.Multimedia.AudioIO/WavPlayer/WavPlayer.cs b/src/Tizen.Multimedia.AudioIO/WavPlayer/WavPlayer.cs index 5c159d5cbff..3dcfb24c26e 100644 --- a/src/Tizen.Multimedia.AudioIO/WavPlayer/WavPlayer.cs +++ b/src/Tizen.Multimedia.AudioIO/WavPlayer/WavPlayer.cs @@ -15,6 +15,7 @@ */ using System; +using System.ComponentModel; using System.IO; using System.Threading; using System.Threading.Tasks; @@ -85,20 +86,62 @@ public static Task StartAsync(string path, AudioStreamPolicy streamPolicy, } return cancellationToken.IsCancellationRequested ? Task.FromCanceled(cancellationToken) : - StartAsyncCore(path, streamPolicy, cancellationToken); + StartAsyncCore(path, streamPolicy, 1, cancellationToken); } - private static async Task StartAsyncCore(string path, AudioStreamPolicy streamPolicy, + /// + /// Plays a wav file based on the specified with given repetition number. + /// + /// If loopCount is 0, it means infinite loops + /// A task that represents the asynchronous operation. + /// A file path to play. + /// A . + /// A number of repetitions. + /// A cancellation token which can be used to stop. + /// + /// is null. + /// -or- + /// is null. + /// + /// An internal error occurs. + /// does not exists. + /// The format of is not supported. + /// has already been disposed of. + [EditorBrowsable(EditorBrowsableState.Never)] + public static Task StartAsync(string path, AudioStreamPolicy streamPolicy, uint loopCount, + CancellationToken cancellationToken) + { + if (path == null) + { + throw new ArgumentNullException(nameof(path)); + } + + if (streamPolicy == null) + { + throw new ArgumentNullException(nameof(streamPolicy)); + } + + if (File.Exists(path) == false) + { + throw new FileNotFoundException("File does not exists.", path); + } + + return cancellationToken.IsCancellationRequested ? Task.FromCanceled(cancellationToken) : + StartAsyncCore(path, streamPolicy, loopCount, cancellationToken); + } + + private static async Task StartAsyncCore(string path, AudioStreamPolicy streamPolicy, uint loopCount, CancellationToken cancellationToken) { + int id = 0; var tcs = new TaskCompletionSource(); Native.WavPlayerCompletedCallback cb = (id_, _) => tcs.TrySetResult(true); using (var cbKeeper = ObjectKeeper.Get(cb)) { - Native.Start(path, streamPolicy.Handle, cb, IntPtr.Zero, out var id). - Validate("Failed to play."); + Native.StartLoop(path, streamPolicy.Handle, loopCount, cb, IntPtr.Zero, out id). + Validate("Failed to play with loop."); using (RegisterCancellationAction(tcs, cancellationToken, id)) {