81 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
package kha.audio1;
 | 
						|
 | 
						|
import system.io.Path;
 | 
						|
import system.Uri;
 | 
						|
import system.UriKind;
 | 
						|
import system.windows.controls.MediaElement;
 | 
						|
import system.windows.controls.MediaState;
 | 
						|
 | 
						|
class WpfAudioChannel implements kha.audio1.AudioChannel {
 | 
						|
	var player: MediaElement;
 | 
						|
	var hasFinished: Bool = false;
 | 
						|
 | 
						|
	public function new(filename: String) {
 | 
						|
		this.player = new MediaElement();
 | 
						|
		addEventHandlers();
 | 
						|
		player.LoadedBehavior = MediaState.Manual;
 | 
						|
		player.UnloadedBehavior = MediaState.Manual;
 | 
						|
		// MediaElement needs Absolute URI. Relative won't work
 | 
						|
		player.Source = new Uri(Path.GetFullPath(filename), UriKind.Absolute);
 | 
						|
		// TODO: perhaps files should be checked for validity?
 | 
						|
 | 
						|
		play();
 | 
						|
	}
 | 
						|
 | 
						|
	public function play(): Void {
 | 
						|
		hasFinished = false;
 | 
						|
		player.Play();
 | 
						|
	}
 | 
						|
 | 
						|
	public function pause(): Void {
 | 
						|
		player.Pause();
 | 
						|
	}
 | 
						|
 | 
						|
	public function stop(): Void {
 | 
						|
		hasFinished = true;
 | 
						|
		player.Stop();
 | 
						|
	}
 | 
						|
 | 
						|
	public var length(get, never): Float;
 | 
						|
 | 
						|
	@:functionCode('
 | 
						|
		if (player.NaturalDuration.HasTimeSpan) return player.NaturalDuration.TimeSpan.TotalMilliseconds * 1000.0;
 | 
						|
		else return float.MaxValue;
 | 
						|
	')
 | 
						|
	function get_length(): Float {
 | 
						|
		return 0;
 | 
						|
	}
 | 
						|
 | 
						|
	public var position(get, never): Float; // Seconds
 | 
						|
 | 
						|
	@:functionCode('return Math.round(player.Position.TotalMilliseconds) * 1000.0;')
 | 
						|
	function get_position(): Float {
 | 
						|
		return 0;
 | 
						|
	}
 | 
						|
 | 
						|
	public var volume(get, set): Float;
 | 
						|
 | 
						|
	function get_volume(): Float {
 | 
						|
		return player.Volume;
 | 
						|
	}
 | 
						|
 | 
						|
	function set_volume(value: Float): Float {
 | 
						|
		return player.Volume = value;
 | 
						|
	}
 | 
						|
 | 
						|
	public var finished(get, never): Bool;
 | 
						|
 | 
						|
	function get_finished(): Bool {
 | 
						|
		return hasFinished;
 | 
						|
	}
 | 
						|
 | 
						|
	@:functionCode('
 | 
						|
		player.MediaEnded += OnMediaEnded;
 | 
						|
	')
 | 
						|
	function addEventHandlers() {}
 | 
						|
 | 
						|
	function OnMediaEnded(obj: Dynamic, e: RoutedEventArgs) {
 | 
						|
		hasFinished = true;
 | 
						|
	}
 | 
						|
}
 |