Bug Report: PUN2 Voice Prefab not working without Auto Create Recorder
shafy
✭
in Photon Voice
I wasn't able to transmit voice from my voice prefab until I enabled "Auto Create Recorder" in "Photon Voice View". Before that, I had manually added a "Recorder" component to my prefab, configured it (including setting the "Transmit" attribute to true) and dragged it into the "Photon Voice View: Recorder In Use" field.
Nevertheless, I was getting a null exception (couldn't find the Recorder). After removing the Recorder and enabling "Auto Create Recorder", it started working.
I have "Use Primary Recorder" disabled, and no Primary Recorder in "Photon Voice Network", either.
I'm on Unity 2018.2.11f1, PUN2 and Photon Voice 2.
Not sure if I was doing something wrong or if it's a bug, thought I'd report it here so that you can take a look at it.
Nevertheless, I was getting a null exception (couldn't find the Recorder). After removing the Recorder and enabling "Auto Create Recorder", it started working.
I have "Use Primary Recorder" disabled, and no Primary Recorder in "Photon Voice Network", either.
I'm on Unity 2018.2.11f1, PUN2 and Photon Voice 2.
Not sure if I was doing something wrong or if it's a bug, thought I'd report it here so that you can take a look at it.
0
Comments
-
Hi @shafy,
Thank you for choosing Photon and for your bug report!
I have managed to reproduce the issue described yes.
The Recorder is being accessed from the PhotonVoiceView.OnEnable before Recorder.Awake is called which throws a null reference exception when trying to access Logger property which is not initialized yet.
This can be fixed in multiple ways:
1. Always put Recorder component before PhotonVoiceView in the same GameObject so its Recorder.Awake is called before any PhotonVoiceView methods
2. Make the Recorder.Logger (VoiceComponent.Logger) property getter lazy initialize a backing field to avoid null reference:public abstract class VoiceComponent : MonoBehaviour, ILoggable { private VoiceLogger logger; public VoiceLogger Logger { get { if (logger == null) { logger = new VoiceLogger(this, string.Format("{0}.{1}", name, this.GetType().Name), logLevel); } return logger; } protected set { logger = value; } } protected virtual void Awake() { if (logger == null) { logger = new VoiceLogger(this, string.Format("{0}.{1}", name, this.GetType().Name), logLevel); } }
I don't know how bad is this considering the additional null check each time Logger is accessed.
3. Delay accessing anything Recorder related until Recorder.Awake is called. I think this is commonly used but I don't know if it's a good idea to do it here.
We will fix this in the next update.
You could try any of the aforementioned solutions (1 or 2) for now.0 -
Just tested it with putting Recorder before PhotonVoiceView, and now I get this bug here:ArgumentException: Couldn't acquire device ID for device name ,[H
11-02 10:25:17.596 19965 19981 E Unity : at Photon.Voice.Unity.MicWrapper..ctor (System.String device, Int32 suggestedFrequency) [0x00075] in /Users/can/Unity/multiplayer test/Assets/Photon/PhotonVoice/PhotonVoiceApi/Platforms/Unity/MicWrapper.cs:310 -
Hi @shafy,
I wouldn't say recommended but it's an alternative to Unity microphone API as we noticed it's sometimes unreliable/limited and has issues between versions or on some platforms. It's definitely a workaround if Unity microphone does not work.
Could you try this version here.
Please be careful when importing: Unity Editor "Native Library Updates".
I recommend testing in a clean/fresh/new/empty project.0