Exemple #1
0
    public AudioTrack(AudioTrackData data, AudioSystem system)
    {
        this._trackState = TrackState.STATE_IDLE;
        this._trackData  = data;

        this._channels = new Dictionary <string, AudioChannel>();
        data.GenerateChannels(ref this._channels, this, system);
        this._parentSystem = system;
    }
Exemple #2
0
        public static void ReturnAudioTrack(AudioTrack audioTrack)
        {
            AudioTrackData audioTrackData = null;

            for (int i = 0; i < m_audioTracks.Count; i++)
            {
                if (m_audioTracks[i].AudioTrack == audioTrack)
                {
                    audioTrackData = m_audioTracks[i];
                    break;
                }
            }
            if (!Mixer.EnableAudioTrackCaching)
            {
                if (audioTrackData != null)
                {
                    m_audioTracks.Remove(audioTrackData);
                }
                audioTrack.Pause();
                audioTrack.Release();
                return;
            }
            if (audioTrackData == null)
            {
                audioTrack.Pause();
                audioTrack.Release();
                return;
            }
            bool flag = false;

            if (m_audioTracks.Count > 16)
            {
                flag = true;
                for (int j = 0; j < m_audioTracks.Count; j++)
                {
                    if (m_audioTracks[j].BytesCount < audioTrackData.BytesCount)
                    {
                        flag = false;
                        break;
                    }
                }
            }
            if (flag)
            {
                audioTrack.Pause();
                audioTrack.Release();
                m_audioTracks.Remove(audioTrackData);
            }
            else
            {
                audioTrack.Stop();
                audioTrack.SetPlaybackHeadPosition(audioTrackData.BytesCount / audioTrackData.SoundBuffer.ChannelsCount / 2);
                audioTrackData.ReloadStaticDataTime = Time.FrameStartTime + 0.75;
            }
            LogCacheStats();
        }
Exemple #3
0
        public static AudioTrack GetAudioTrack(SoundBuffer soundBuffer, bool isLooped)
        {
            if (!isLooped && Mixer.EnableAudioTrackCaching && m_audioTracks.Count >= 16)
            {
                foreach (AudioTrackData audioTrack2 in m_audioTracks)
                {
                    if (audioTrack2.IsAvailable && audioTrack2.SoundBuffer == soundBuffer)
                    {
                        audioTrack2.IsAvailable = false;
                        m_cacheHits++;
                        LogCacheStats();
                        return(audioTrack2.AudioTrack);
                    }
                }
                AudioTrackData audioTrackData = null;
                foreach (AudioTrackData audioTrack3 in m_audioTracks)
                {
                    if (audioTrack3.IsAvailable && audioTrack3.SoundBuffer.ChannelsCount == soundBuffer.ChannelsCount && audioTrack3.SoundBuffer.SamplingFrequency == soundBuffer.SamplingFrequency && audioTrack3.BytesCount >= soundBuffer.m_data.Length && (audioTrackData == null || audioTrack3.BytesCount <= audioTrackData.BytesCount))
                    {
                        audioTrackData = audioTrack3;
                    }
                }
                if (audioTrackData != null)
                {
                    if (m_buffer == null || m_buffer.Length < audioTrackData.BytesCount)
                    {
                        m_buffer = new byte[audioTrackData.BytesCount];
                    }
                    Array.Copy(soundBuffer.m_data, 0, m_buffer, 0, soundBuffer.m_data.Length);
                    Array.Clear(m_buffer, soundBuffer.m_data.Length, audioTrackData.BytesCount - soundBuffer.m_data.Length);
                    audioTrackData.AudioTrack.Write(m_buffer, 0, audioTrackData.BytesCount);
                    audioTrackData.SoundBuffer = soundBuffer;
                    audioTrackData.IsAvailable = false;
                    m_cacheHitsWithWrite++;
                    LogCacheStats();
                    return(audioTrackData.AudioTrack);
                }
                bool flag = true;
                foreach (AudioTrackData audioTrack4 in m_audioTracks)
                {
                    if (audioTrack4.BytesCount < soundBuffer.m_data.Length)
                    {
                        flag = false;
                        break;
                    }
                }
                if (flag)
                {
                    m_cacheFulls++;
                    Log.Warning("AudioTrackCache full, no audio tracks available.");
                    LogCacheStats();
                    return(null);
                }
            }
            AudioTrack audioTrack = new AudioTrack(Stream.Music, soundBuffer.SamplingFrequency, (soundBuffer.ChannelsCount == 1) ? ChannelOut.FrontLeft : ChannelOut.Stereo, Encoding.Pcm16bit, soundBuffer.m_data.Length, AudioTrackMode.Static);

//			AudioTrack audioTrack = new AudioTrack(new AudioAttributes.Builder().SetUsage(AudioUsageKind.Media).SetContentType(AudioContentType.Music).Build(),new AudioFormat(), soundBuffer.m_data.Length, AudioTrackMode.Static,0);

            if (audioTrack.State != 0)
            {
                audioTrack.Write(soundBuffer.m_data, 0, soundBuffer.m_data.Length);
                if (!isLooped)
                {
                    m_audioTracks.Add(new AudioTrackData
                    {
                        AudioTrack  = audioTrack,
                        SoundBuffer = soundBuffer,
                        BytesCount  = soundBuffer.m_data.Length,
                        IsAvailable = false
                    });
                }
                else
                {
                    Mixer.CheckTrackStatus(audioTrack.SetLoopPoints(0, soundBuffer.SamplesCount, -1));
                }
            }
            else
            {
                audioTrack.Release();
                audioTrack = null;
                Log.Warning("Failed to create Cache AudioTrack.");
            }
            m_cacheMisses++;
            if (Mixer.EnableAudioTrackCaching && m_cacheMisses > 200 && m_cacheMisses % 100 == 0)
            {
                Log.Warning("Over {0} AudioTrack objects created.", m_cacheMisses);
            }
            LogCacheStats();
            return(audioTrack);
        }