From 4e0e322e32b0d7b5d1692f72876ac7f9ae2e610a Mon Sep 17 00:00:00 2001 From: Jfreegman Date: Tue, 5 Apr 2016 00:49:46 -0400 Subject: [PATCH] Fix cross-client audio issue --- src/audio_call.c | 14 ++++++++------ src/audio_device.c | 5 +++-- src/audio_device.h | 4 ++-- src/notify.c | 1 - 4 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/audio_call.c b/src/audio_call.c index 86abb05..2fd4024 100644 --- a/src/audio_call.c +++ b/src/audio_call.c @@ -103,7 +103,8 @@ void callback_call_canceled ( uint32_t friend_number ); void callback_call_rejected ( uint32_t friend_number ); void callback_call_ended ( uint32_t friend_number ); -void write_device_callback( uint32_t friend_number, const int16_t* PCM, uint16_t size ); +void write_device_callback( uint32_t friend_number, const int16_t* PCM, uint16_t sample_count, uint8_t channels, + uint32_t sample_rate ); static void print_err (ToxWindow *self, const char *error_str) { @@ -120,9 +121,9 @@ ToxAV *init_audio(ToxWindow *self, Tox *tox) CallControl.av = toxav_new(tox, &error); CallControl.audio_enabled = true; - CallControl.audio_bit_rate = 48; + CallControl.audio_bit_rate = 64; CallControl.audio_sample_rate = 48000; - CallControl.audio_frame_duration = 10; + CallControl.audio_frame_duration = 20; CallControl.audio_channels = 1; #ifndef VIDEO @@ -180,10 +181,11 @@ void read_device_callback(const int16_t* captured, uint32_t size, void* data) {} } -void write_device_callback(uint32_t friend_number, const int16_t* PCM, uint16_t size) +void write_device_callback(uint32_t friend_number, const int16_t* PCM, uint16_t sample_count, uint8_t channels, + uint32_t sample_rate) { if ( CallControl.calls[friend_number].ttas ) - write_out(CallControl.calls[friend_number].out_idx, PCM, size, CallControl.audio_channels); + write_out(CallControl.calls[friend_number].out_idx, PCM, sample_count, channels, sample_rate); } int start_transmission(ToxWindow *self, Call *call) @@ -328,7 +330,7 @@ void receive_audio_frame_cb(ToxAV *av, uint32_t friend_number, int16_t const *pcm, size_t sample_count, uint8_t channels, uint32_t sampling_rate, void *user_data) { - write_device_callback(friend_number, pcm, frame_size); + write_device_callback(friend_number, pcm, sample_count, channels, sampling_rate); } void audio_bit_rate_status_cb(ToxAV *av, uint32_t friend_number, uint32_t audio_bit_rate, diff --git a/src/audio_device.c b/src/audio_device.c index fabed10..c74e8ea 100644 --- a/src/audio_device.c +++ b/src/audio_device.c @@ -357,7 +357,8 @@ DeviceError register_device_callback( int32_t friend_number, uint32_t device_idx return de_None; } -inline__ DeviceError write_out(uint32_t device_idx, const int16_t* data, uint32_t length, uint8_t channels) +inline__ DeviceError write_out(uint32_t device_idx, const int16_t* data, uint32_t sample_count, uint8_t channels, + uint32_t sample_rate) { if (device_idx >= MAX_DEVICES) return de_InvalidSelection; @@ -386,7 +387,7 @@ inline__ DeviceError write_out(uint32_t device_idx, const int16_t* data, uint32_ } - alBufferData(bufid, device->sound_mode, data, length * 2 * channels, device->sample_rate); + alBufferData(bufid, channels == 1 ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16, data, sample_count * 2 * channels, sample_rate); alSourceQueueBuffers(device->source, 1, &bufid); ALint state; diff --git a/src/audio_device.h b/src/audio_device.h index cc1b268..34d1ecc 100644 --- a/src/audio_device.h +++ b/src/audio_device.h @@ -22,7 +22,7 @@ /* * You can have multiple sources (Input devices) but only one output device. - * Pass buffers to output device via write(); + * Pass buffers to output device via write(); * Read from running input device(s) via select()/callback combo. */ @@ -82,7 +82,7 @@ DeviceError open_device(DeviceType type, int32_t selection, uint32_t* device_idx DeviceError close_device(DeviceType type, uint32_t device_idx); /* Write data to device */ -DeviceError write_out(uint32_t device_idx, const int16_t* data, uint32_t length, uint8_t channels); +DeviceError write_out(uint32_t device_idx, const int16_t* data, uint32_t length, uint8_t channels, uint32_t sample_rate); void print_devices(ToxWindow* self, DeviceType type); void get_primary_device_name(DeviceType type, char *buf, int size); diff --git a/src/notify.c b/src/notify.c index 66336f4..093ad95 100644 --- a/src/notify.c +++ b/src/notify.c @@ -580,7 +580,6 @@ int sound_notify2(ToxWindow* self, Notification notif, uint64_t flags, int id) alDeleteSources(1, &actives[id].source); alDeleteBuffers(1,&actives[id].buffer); - alGenSources(1, &actives[id].source); alGenBuffers(1, &actives[id].buffer); actives[id].buffer = alutCreateBufferFromFile(Control.sounds[notif]);