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; | ||
|  | 	} | ||
|  | } |