121 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			121 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C#
		
	
	
	
| #if UNITY_5_4_OR_NEWER || (UNITY_5 && !UNITY_5_0)
 | |
| 	#define UNITY_HELPATTRIB
 | |
| #endif
 | |
| 
 | |
| using UnityEngine;
 | |
| 
 | |
| //-----------------------------------------------------------------------------
 | |
| // Copyright 2015-2018 RenderHeads Ltd.  All rights reserverd.
 | |
| //-----------------------------------------------------------------------------
 | |
| 
 | |
| namespace RenderHeads.Media.AVProVideo
 | |
| {
 | |
| 	/// <summary>
 | |
| 	/// This is an experimental feature and only works in Windows currently
 | |
| 	/// Audio is grabbed from the MediaPlayer and rendered via Unity
 | |
| 	/// This allows audio to have 3D spatial control, effects applied and to be spatialised for VR
 | |
| 	/// </summary>
 | |
| 	[RequireComponent(typeof(AudioSource))]
 | |
| 	[AddComponentMenu("AVPro Video/Audio Output", 400)]
 | |
| #if UNITY_HELPATTRIB
 | |
| 	[HelpURL("http://renderheads.com/product/avpro-video/")]
 | |
| #endif
 | |
| 	public class AudioOutput : MonoBehaviour
 | |
| 	{
 | |
| 		public enum AudioOutputMode
 | |
| 		{
 | |
| 			Single,
 | |
| 			Multiple
 | |
| 		}
 | |
| 
 | |
| 		public AudioOutputMode _audioOutputMode = AudioOutputMode.Multiple;
 | |
| 
 | |
| 		[SerializeField]
 | |
| 		private MediaPlayer _mediaPlayer;
 | |
| 
 | |
| 		private AudioSource _audioSource;
 | |
| 
 | |
| 		[HideInInspector]
 | |
| 		public int _channelMask = -1;
 | |
| 
 | |
| 		void Awake()
 | |
| 		{
 | |
| 			_audioSource = this.GetComponent<AudioSource>();
 | |
| 		}
 | |
| 
 | |
| 		void Start()
 | |
| 		{
 | |
| 			ChangeMediaPlayer(_mediaPlayer);
 | |
| #if (!UNITY_5 && !UNITY_5_4_OR_NEWER)
 | |
| 			Debug.LogWarning("[AVProVideo] AudioOutput component requires Unity 5.x or above", this);
 | |
| #endif
 | |
| 		}
 | |
| 
 | |
| 		void OnDestroy()
 | |
| 		{
 | |
| 			ChangeMediaPlayer(null);
 | |
| 		}
 | |
| 
 | |
| 		void Update()
 | |
| 		{
 | |
| 			if (_mediaPlayer != null && _mediaPlayer.Control != null && _mediaPlayer.Control.IsPlaying())
 | |
| 			{
 | |
| 				ApplyAudioSettings(_mediaPlayer, _audioSource);
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		public void ChangeMediaPlayer(MediaPlayer newPlayer)
 | |
| 		{
 | |
| 			// When changing the media player, handle event subscriptions
 | |
| 			if (_mediaPlayer != null)
 | |
| 			{
 | |
| 				_mediaPlayer.Events.RemoveListener(OnMediaPlayerEvent);
 | |
| 				_mediaPlayer = null;
 | |
| 			}
 | |
| 
 | |
| 			_mediaPlayer = newPlayer;
 | |
| 			if (_mediaPlayer != null)
 | |
| 			{
 | |
| 				_mediaPlayer.Events.AddListener(OnMediaPlayerEvent);
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		// Callback function to handle events
 | |
| 		private void OnMediaPlayerEvent(MediaPlayer mp, MediaPlayerEvent.EventType et, ErrorCode errorCode)
 | |
| 		{
 | |
| 			switch (et)
 | |
| 			{
 | |
| 				case MediaPlayerEvent.EventType.Closing:
 | |
| 					_audioSource.Stop();
 | |
| 					break;
 | |
| 				case MediaPlayerEvent.EventType.Started:
 | |
| 					ApplyAudioSettings(_mediaPlayer, _audioSource);
 | |
| 					_audioSource.Play();
 | |
| 					break;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		private static void ApplyAudioSettings(MediaPlayer player, AudioSource audioSource)
 | |
| 		{
 | |
| 			// Apply volume and mute from the MediaPlayer to the AudioSource
 | |
| 			if (player != null && player.Control != null)
 | |
| 			{
 | |
| 				float volume = player.Control.GetVolume();
 | |
| 				bool isMuted = player.Control.IsMuted();
 | |
| 				float rate = player.Control.GetPlaybackRate();
 | |
| 				audioSource.volume = volume;
 | |
| 				audioSource.mute = isMuted;
 | |
| 				audioSource.pitch = rate;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| #if (UNITY_5 || UNITY_5_4_OR_NEWER)
 | |
| #if UNITY_STANDALONE_WIN || UNITY_EDITOR_WIN || UNITY_WSA_10_0 || UNITY_WINRT_8_1
 | |
| 		void OnAudioFilterRead(float[] data, int channels)
 | |
| 		{
 | |
| 			AudioOutputManager.Instance.RequestAudio(this, _mediaPlayer, data, _channelMask, channels, _audioOutputMode);
 | |
| 		}
 | |
| #endif
 | |
| #endif
 | |
| 	}
 | |
| } |