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.Diagnostics;
21 namespace Tizen.Multimedia
24 /// Provides a means to configure properties and handle events for <see cref="MediaStreamSource"/>.
26 /// <seealso cref="MediaStreamSource"/>
27 public class MediaStreamConfiguration
29 private const ulong DefaultBufferMaxSize = 200000;
30 private const uint DefaultBufferMinThreshold = 0;
32 private readonly MediaStreamSource _owner;
33 private readonly StreamType _streamType;
35 private ulong _bufferMaxSize = DefaultBufferMaxSize;
36 private uint _threshold = DefaultBufferMinThreshold;
38 internal MediaStreamConfiguration(MediaStreamSource owner, StreamType streamType)
41 _streamType = streamType;
45 /// Occurs when the buffer underruns or overflows.
47 /// <remarks>The event handler will be executed on an internal thread.</remarks>
48 /// <seealso cref="BufferMaxSize"/>
49 /// <seealso cref="BufferMinThreshold"/>
50 public event EventHandler<MediaStreamBufferStatusChangedEventArgs> BufferStatusChanged;
53 /// Occurs when the seeking is requested.
55 /// <remarks>The event handler will be executed on an internal thread.</remarks>
56 public event EventHandler<MediaStreamSeekingOccurredEventArgs> SeekingOccurred;
59 /// Gets the max size of the buffer.
61 /// <value>The max size of the buffer. The default is 200000.</value>
62 /// <remarks>If the buffer level overflows the max size, <see cref="BufferStatusChanged"/> will be raised with <see cref="MediaStreamBufferStatus.Overflow"/>.</remarks>
63 /// <exception cref="InvalidOperationException">The <see cref="MediaStreamSource"/> is not assigned to a player.</exception>
64 /// <exception cref="ArgumentOutOfRangeException"><paramref name="value"/> is zero.</exception>
65 /// <seealso cref="BufferStatusChanged"/>
66 public ulong BufferMaxSize
70 return _bufferMaxSize;
74 if (_owner.Player == null)
76 throw new InvalidOperationException("The source is not assigned to a player yet.");
79 Debug.Assert(_owner.Player.IsDisposed == false);
83 throw new ArgumentOutOfRangeException(nameof(value), value, "the buffer max size can't be zero.");
86 NativePlayer.SetMediaStreamBufferMaxSize(_owner.Player.Handle, _streamType, value).
87 ThrowIfFailed("Failed to set the buffer max size");
89 _bufferMaxSize = value;
94 /// Gets the minimum threshold of the buffer, or zero if the <see cref="MediaStreamSource"/> is not assigned to a player.
96 /// <value>The minimum threshold of the buffer in percentage. The default is zero.</value>
97 /// <remarks>If the buffer level drops below the threshold value, <see cref="BufferStatusChanged"/> will be raised with <see cref="MediaStreamBufferStatus.Underrun"/>.</remarks>
98 /// <exception cref="InvalidOperationException">The <see cref="MediaStreamSource"/> is not assigned to a player.</exception>
99 /// <exception cref="ArgumentOutOfRangeException"><paramref name="value"/> is greater than 100.</exception>
100 /// <seealso cref="BufferStatusChanged"/>
101 public uint BufferMinThreshold
109 if (_owner.Player == null)
111 throw new InvalidOperationException("The source is not assigned to a player yet.");
114 Debug.Assert(_owner.Player.IsDisposed == false);
118 throw new ArgumentOutOfRangeException(nameof(value), value,
119 $"The threshold can't be greater than 100, but got { value }.");
122 NativePlayer.SetMediaStreamBufferMinThreshold(_owner.Player.Handle, _streamType, value).
123 ThrowIfFailed("Failed to set the buffer minimum threshold");
129 internal void OnPlayerSet(Player player)
131 if (_streamType == StreamType.Audio)
133 player.MediaStreamAudioSeekingOccurred += MediaStreamSeekingOccurred;
134 player.MediaStreamAudioBufferStatusChanged += MediaStreamBufferStatusChanged;
138 player.MediaStreamVideoSeekingOccurred += MediaStreamSeekingOccurred;
139 player.MediaStreamVideoBufferStatusChanged += MediaStreamBufferStatusChanged;
142 NativePlayer.SetMediaStreamBufferMaxSize(player.Handle, _streamType, _bufferMaxSize).
143 ThrowIfFailed("Failed to initialize the media stream configuration");
145 NativePlayer.SetMediaStreamBufferMinThreshold(player.Handle, _streamType, _threshold).
146 ThrowIfFailed("Failed to initialize the media stream configuration");
149 internal void OnPlayerUnset(Player player)
151 if (_streamType == StreamType.Audio)
153 player.MediaStreamAudioSeekingOccurred -= MediaStreamSeekingOccurred;
154 player.MediaStreamAudioBufferStatusChanged -= MediaStreamBufferStatusChanged;
158 player.MediaStreamVideoSeekingOccurred -= MediaStreamSeekingOccurred;
159 player.MediaStreamVideoBufferStatusChanged -= MediaStreamBufferStatusChanged;
163 private void MediaStreamBufferStatusChanged(object sender, MediaStreamBufferStatusChangedEventArgs e)
165 BufferStatusChanged?.Invoke(this, e);
168 private void MediaStreamSeekingOccurred(object sender, MediaStreamSeekingOccurredEventArgs e)
170 SeekingOccurred?.Invoke(this, e);