Synchronize audio encoder selection
This commit is contained in:
committed by
Brandon McGinty
parent
d399650198
commit
7785f0a5b5
@@ -99,7 +99,7 @@ func (b *Barnard) connect(reconnect bool) bool {
|
|||||||
})
|
})
|
||||||
|
|
||||||
// Initialize stereo encoder for file playback
|
// Initialize stereo encoder for file playback
|
||||||
b.Client.AudioEncoderStereo = opus.NewStereoEncoder()
|
b.Client.SetStereoEncoder(opus.NewStereoEncoder())
|
||||||
|
|
||||||
// Initialize file player
|
// Initialize file player
|
||||||
b.FileStreamMutex.Lock()
|
b.FileStreamMutex.Lock()
|
||||||
|
|||||||
+12
-10
@@ -53,28 +53,30 @@ type AudioStreamEvent struct {
|
|||||||
type AudioBuffer []int16
|
type AudioBuffer []int16
|
||||||
|
|
||||||
func (a AudioBuffer) writeAudio(client *Client, seq int64, final bool) error {
|
func (a AudioBuffer) writeAudio(client *Client, seq int64, final bool) error {
|
||||||
// Always use the mono encoder for voice transmission. The stereo
|
// Encoding shares mutable codec state with server-configuration and file
|
||||||
// encoder is only used when explicitly enabled for file playback.
|
// playback changes. Keep the client read lock through Encode and Reset so a
|
||||||
|
// stereo encoder cannot be replaced or reset while it is in use.
|
||||||
|
client.volatile.RLock()
|
||||||
encoder := client.AudioEncoder
|
encoder := client.AudioEncoder
|
||||||
if client.IsStereoEncoderEnabled() && client.AudioEncoderStereo != nil {
|
if client.useStereoEncoder && client.AudioEncoderStereo != nil {
|
||||||
encoder = client.AudioEncoderStereo
|
encoder = client.AudioEncoderStereo
|
||||||
}
|
}
|
||||||
if encoder == nil {
|
if encoder == nil {
|
||||||
|
client.volatile.RUnlock()
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
dataBytes := client.Config.AudioDataBytes
|
raw, err := encoder.Encode(a, len(a), client.Config.AudioDataBytes)
|
||||||
raw, err := encoder.Encode(a, len(a), dataBytes)
|
|
||||||
if final {
|
if final {
|
||||||
defer encoder.Reset()
|
encoder.Reset()
|
||||||
}
|
}
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
var targetID byte
|
var targetID byte
|
||||||
if target := client.VoiceTarget; target != nil {
|
if target := client.VoiceTarget; target != nil {
|
||||||
targetID = byte(target.ID)
|
targetID = byte(target.ID)
|
||||||
}
|
}
|
||||||
|
client.volatile.RUnlock()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
return client.WriteAudio(byte(4), targetID, seq, final, raw, nil, nil, nil)
|
return client.WriteAudio(byte(4), targetID, seq, final, raw, nil, nil, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -343,6 +343,13 @@ func (c *Client) Send(message Message) {
|
|||||||
message.writeMessage(c)
|
message.writeMessage(c)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SetStereoEncoder installs the encoder used for stereo file playback.
|
||||||
|
func (c *Client) SetStereoEncoder(encoder AudioEncoder) {
|
||||||
|
c.volatile.Lock()
|
||||||
|
defer c.volatile.Unlock()
|
||||||
|
c.AudioEncoderStereo = encoder
|
||||||
|
}
|
||||||
|
|
||||||
// EnableStereoEncoder switches to stereo encoding for file playback.
|
// EnableStereoEncoder switches to stereo encoding for file playback.
|
||||||
func (c *Client) EnableStereoEncoder() {
|
func (c *Client) EnableStereoEncoder() {
|
||||||
c.volatile.Lock()
|
c.volatile.Lock()
|
||||||
|
|||||||
Reference in New Issue
Block a user