You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							177 lines
						
					
					
						
							6.3 KiB
						
					
					
				
			
		
		
	
	
							177 lines
						
					
					
						
							6.3 KiB
						
					
					
				| // License: Apache 2.0. See LICENSE file in root directory.
 | |
| // Copyright(c) 2017 Intel Corporation. All Rights Reserved.
 | |
| 
 | |
| namespace Intel.RealSense
 | |
| {
 | |
|     using System;
 | |
|     using System.Collections;
 | |
|     using System.Collections.Generic;
 | |
|     using System.Runtime.InteropServices;
 | |
| 
 | |
|     // TODO: rs2_create_playback_device
 | |
|     // TODO: rs2_playback_device_set_status_changed_callback
 | |
|     public class PlaybackDevice : Device
 | |
|     {
 | |
|         internal PlaybackDevice(IntPtr dev)
 | |
|             : base(dev)
 | |
|         {
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Create a <see cref="PlaybackDevice"/> from existing <see cref="Device"/>
 | |
|         /// </summary>
 | |
|         /// <param name="dev">a device that supports <see cref="Extension.Playback"/></param>
 | |
|         /// <returns>a new <see cref="PlaybackDevice"/></returns>
 | |
|         /// <exception cref="ArgumentException">Thrown when <paramref name="dev"/> does not support <see cref="Extension.Playback"/></exception>
 | |
|         public static PlaybackDevice FromDevice(Device dev)
 | |
|         {
 | |
|             object error;
 | |
|             if (NativeMethods.rs2_is_device_extendable_to(dev.Handle, Extension.Playback, out error) == 0)
 | |
|             {
 | |
|                 throw new ArgumentException($"Device does not support {nameof(Extension.Playback)}");
 | |
|             }
 | |
| 
 | |
|             var playback = Device.Create<PlaybackDevice>(dev.Handle);
 | |
|             playback.FileName = Marshal.PtrToStringAnsi(NativeMethods.rs2_playback_device_get_file_path(dev.Handle, out error));
 | |
|             return playback;
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets the path of the file used by the playback device
 | |
|         /// </summary>
 | |
|         /// <value>Path to the file used by the playback device</value>
 | |
|         public string FileName { get; private set; }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Pauses the playback
 | |
|         /// </summary>
 | |
|         /// <remarks>
 | |
|         /// Calling Pause() in "Paused" status does nothing
 | |
|         /// If Pause() is called while playback status is "Playing" or "Stopped", the playback will not play until Resume() is called
 | |
|         /// </remarks>
 | |
|         public void Pause()
 | |
|         {
 | |
|             object error;
 | |
|             NativeMethods.rs2_playback_device_pause(Handle, out error);
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Un-pauses the playback
 | |
|         /// </summary>
 | |
|         /// <remarks>
 | |
|         /// Calling Resume() while playback status is "Playing" or "Stopped" does nothing
 | |
|         /// </remarks>
 | |
|         public void Resume()
 | |
|         {
 | |
|             object error;
 | |
|             NativeMethods.rs2_playback_device_resume(Handle, out error);
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Stops the playback
 | |
|         /// </summary>
 | |
|         /// <remarks>
 | |
|         /// Calling Stop() will stop all streaming playback sensors and will reset the playback(returning to beginning of file)
 | |
|         /// </remarks>
 | |
|         public void Stop()
 | |
|         {
 | |
|             object error;
 | |
|             NativeMethods.rs2_playback_device_stop(Handle, out error);
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets the current state of the playback device
 | |
|         /// </summary>
 | |
|         /// <value>Current state of the playback</value>
 | |
|         public PlaybackStatus Status
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 object error;
 | |
|                 return NativeMethods.rs2_playback_device_get_current_status(Handle, out error);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets the total duration of the file in units of nanoseconds</summary>
 | |
|         /// <value>
 | |
|         /// Total duration of the file in units of nanoseconds
 | |
|         /// </value>
 | |
|         public ulong Duration
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 object error;
 | |
|                 return NativeMethods.rs2_playback_get_duration(Handle, out error);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets or sets the current position of the playback in the file in terms of time. Units are expressed in nanoseconds
 | |
|         /// </summary>
 | |
|         /// <value>
 | |
|         /// Current position of the playback in the file in terms of time. Units are expressed in nanoseconds
 | |
|         /// </value>
 | |
|         public ulong Position
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 object error;
 | |
|                 return NativeMethods.rs2_playback_get_position(Handle, out error);
 | |
|             }
 | |
| 
 | |
|             set
 | |
|             {
 | |
|                 object error;
 | |
|                 NativeMethods.rs2_playback_seek(Handle, (long)value, out error);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Set the playback to a specified time point of the played data
 | |
|         /// </summary>
 | |
|         /// <param name="time">The time point to which playback should seek, expressed in units of nanoseconds (zero value = start)</param>
 | |
|         public void Seek(long time)
 | |
|         {
 | |
|             object error;
 | |
|             NativeMethods.rs2_playback_seek(Handle, time, out error);
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets or sets a value indicating whether the playback works in real time or non real time
 | |
|         /// </summary>
 | |
|         /// <value>Indicates if playback is in real time mode or non real time</value>
 | |
|         /// <remarks>
 | |
|         /// In real time mode, playback will play the same way the file was recorded.
 | |
|         /// In real time mode if the application takes too long to handle the callback, frames may be dropped.
 | |
|         /// In non real time mode, playback will wait for each callback to finish handling the data before
 | |
|         /// reading the next frame. In this mode no frames will be dropped, and the application controls the
 | |
|         /// frame rate of the playback (according to the callback handler duration).
 | |
|         /// </remarks>
 | |
|         public bool Realtime
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 object error;
 | |
|                 return NativeMethods.rs2_playback_device_is_real_time(Handle, out error) != 0;
 | |
|             }
 | |
| 
 | |
|             set
 | |
|             {
 | |
|                 object error;
 | |
|                 NativeMethods.rs2_playback_device_set_real_time(Handle, value ? 1 : 0, out error);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Set the playing speed
 | |
|         /// </summary>
 | |
|         /// <param name="speed">Indicates a multiplication of the speed to play (e.g: 1 = normal, 0.5 twice as slow)</param>
 | |
|         public void SetSpeed(float speed)
 | |
|         {
 | |
|             object error;
 | |
|             NativeMethods.rs2_playback_device_set_playback_speed(Handle, speed, out error);
 | |
|         }
 | |
|     }
 | |
| }
 |