这是indexloc提供的服务,不要输入任何密码
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 7 additions & 8 deletions Runtime/Scripts/AudioStream.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,17 @@ namespace LiveKit
public class AudioStream
{
internal readonly FfiHandle Handle;
private AudioSource _audioSource;
private AudioFilter _audioFilter;
public RtcAudioSource AudioSource { get; private set; }
private RingBuffer _buffer;
private short[] _tempBuffer;
private uint _numChannels;
private uint _sampleRate;
private AudioResampler _resampler = new AudioResampler();
private object _lock = new object();

public AudioStream(IAudioTrack audioTrack, AudioSource source)
public AudioStream(IAudioTrack audioTrack, AudioSource source) : this(audioTrack, new BasicAudioSource(source)) { }

public AudioStream(IAudioTrack audioTrack, RtcAudioSource source)
{
if (!audioTrack.Room.TryGetTarget(out var room))
throw new InvalidOperationException("audiotrack's room is invalid");
Expand All @@ -40,12 +41,10 @@ public AudioStream(IAudioTrack audioTrack, AudioSource source)
UpdateSource(source);
}

private void UpdateSource(AudioSource source)
private void UpdateSource(RtcAudioSource source)
{
_audioSource = source;
_audioFilter = source.gameObject.AddComponent<AudioFilter>();
//_audioFilter.hideFlags = HideFlags.HideInInspector;
_audioFilter.AudioRead += OnAudioRead;
AudioSource = source;
AudioSource.AudioRead += OnAudioRead;
source.Play();
}

Expand Down
36 changes: 36 additions & 0 deletions Runtime/Scripts/BasicAudioSource.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
using System;
using UnityEngine;

namespace LiveKit
{
public class BasicAudioSource : RtcAudioSource
{
protected readonly AudioSource Source;
private readonly AudioFilter _audioFilter;

public override event Action<float[], int, int> AudioRead;

public BasicAudioSource(AudioSource source, int channels = 2, RtcAudioSourceType sourceType = RtcAudioSourceType.AudioSourceCustom) : base(channels, sourceType)
{
Source = source;
_audioFilter = Source.gameObject.AddComponent<AudioFilter>();
}

private void OnAudioRead(float[] data, int channels, int sampleRate)
{
AudioRead?.Invoke(data, channels, sampleRate);
}

public override void Play()
{
_audioFilter.AudioRead += OnAudioRead;
Source.Play();
}

public override void Stop()
{
_audioFilter.AudioRead -= OnAudioRead;
Source.Stop();
}
}
}
3 changes: 3 additions & 0 deletions Runtime/Scripts/BasicAudioSource.cs.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

27 changes: 27 additions & 0 deletions Runtime/Scripts/MicrophoneSource.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
using System.Collections;
using UnityEngine;

namespace LiveKit
{
public class MicrophoneSource : BasicAudioSource
{
private string _deviceName;

public MicrophoneSource(AudioSource source) : base(source, 2, RtcAudioSourceType.AudioSourceMicrophone)
{
}

public void Configure(string device, bool loop, int lenghtSec, int frequency)
{
_deviceName = device;
Source.clip = Microphone.Start(device, loop, lenghtSec, frequency);
Source.loop = true;
}

public override IEnumerator Prepare(float timeout = 0)
{
return new WaitUntil(() => Microphone.GetPosition(_deviceName) > 0);
}

}
}
11 changes: 11 additions & 0 deletions Runtime/Scripts/MicrophoneSource.cs.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
using System;
using UnityEngine;
using System.Collections;
using LiveKit.Proto;
using LiveKit.Internal;
using System.Threading;
using LiveKit.Internal.FFIClients.Requests;
using System.Collections.Generic;

namespace LiveKit
{
Expand All @@ -16,8 +15,12 @@ public enum RtcAudioSourceType
AudioSourceMicrophone = 1,
}

public class RtcAudioSource : IRtcSource
public abstract class RtcAudioSource : IRtcSource
{
public abstract event Action<float[], int, int> AudioRead;
public virtual IEnumerator Prepare(float timeout = 0) { yield break; }
public abstract void Play();

#if UNITY_IOS
// iOS microphone sample rate is 24k,
// please make sure when you using
Expand All @@ -35,28 +38,24 @@ public class RtcAudioSource : IRtcSource

public RtcAudioSourceType SourceType => _sourceType;

private AudioSource _audioSource;
private AudioFilter _audioFilter;

internal readonly FfiHandle Handle;
protected AudioSourceInfo _info;

// Used on the AudioThread
// Possibly used on the AudioThread
private Thread _readAudioThread;
private ThreadSafeQueue<AudioFrame> _frameQueue = new ThreadSafeQueue<AudioFrame>();

private bool _muted = false;

public override bool Muted => _muted;

public RtcAudioSource(AudioSource source, RtcAudioSourceType audioSourceType = RtcAudioSourceType.AudioSourceCustom)
protected RtcAudioSource(int channels = 2, RtcAudioSourceType audioSourceType = RtcAudioSourceType.AudioSourceCustom)
{
_sourceType = audioSourceType;

using var request = FFIBridge.Instance.NewRequest<NewAudioSourceRequest>();
var newAudioSource = request.request;
newAudioSource.Type = AudioSourceType.AudioSourceNative;
newAudioSource.NumChannels = DefaultChannels;
newAudioSource.NumChannels = (uint)channels;
if(_sourceType == RtcAudioSourceType.AudioSourceMicrophone)
{
newAudioSource.SampleRate = DefaultMirophoneSampleRate;
Expand All @@ -73,7 +72,12 @@ public RtcAudioSource(AudioSource source, RtcAudioSourceType audioSourceType = R
FfiResponse res = response;
_info = res.NewAudioSource.Source.Info;
Handle = FfiHandle.FromOwnedHandle(res.NewAudioSource.Source.Handle);
UpdateSource(source);
}

public IEnumerator PrepareAndStart()
{
yield return Prepare();
Start();
}

public void Start()
Expand All @@ -82,16 +86,14 @@ public void Start()
_readAudioThread = new Thread(Update);
_readAudioThread.Start();

_audioFilter.AudioRead += OnAudioRead;
while (!(Microphone.GetPosition(null) > 0)) { }
_audioSource.Play();
AudioRead += OnAudioRead;
Play();
}

public void Stop()
public virtual void Stop()
{
_readAudioThread?.Abort();
if(_audioFilter) _audioFilter.AudioRead -= OnAudioRead;
if(_audioSource && _audioSource.isPlaying) _audioSource.Stop();
AudioRead -= OnAudioRead;
}

private void Update()
Expand All @@ -115,7 +117,6 @@ static short FloatToS16(float v)
v = Math.Max(v, -32768f);
return (short)(v + Math.Sign(v) * 0.5f);
}

unsafe
{
var frameData = new Span<short>(frame.Data.ToPointer(), frame.Length / sizeof(short));
Expand All @@ -132,7 +133,6 @@ static short FloatToS16(float v)
_frameQueue.Enqueue(frame);
}


private void ReadAudio()
{
while (_frameQueue.Count > 0)
Expand Down Expand Up @@ -169,15 +169,10 @@ private void ReadAudio()
}
}

private void UpdateSource(AudioSource source)
{
_audioSource = source;
_audioFilter = source.gameObject.AddComponent<AudioFilter>();
}

public override void SetMute(bool muted)
{
_muted = muted;
}

}
}