forked from LeenkxTeam/LNXSDK
		
	
		
			
	
	
		
			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;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 |