mirror of
https://github.com/irungentoo/toxcore.git
synced 2024-03-22 13:30:51 +08:00
Having two buffers for audio isn't really good.
This commit is contained in:
parent
12f396fcc2
commit
71527c436c
|
@ -369,27 +369,29 @@ void cs_do(CSSession *cs)
|
||||||
Payload *p;
|
Payload *p;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
|
int success = 0;
|
||||||
|
|
||||||
pthread_mutex_lock(cs->queue_mutex);
|
pthread_mutex_lock(cs->queue_mutex);
|
||||||
|
RTPMessage *msg;
|
||||||
|
|
||||||
if (cs->abuf_raw && !buffer_empty(cs->abuf_raw)) {
|
while ((msg = jbuf_read(cs->j_buf, &success)) || success == 2) {
|
||||||
/* Decode audio */
|
|
||||||
buffer_read(cs->abuf_raw, &p);
|
|
||||||
|
|
||||||
/* Leave space for (possibly) other thread to queue more data after we read it here */
|
|
||||||
pthread_mutex_unlock(cs->queue_mutex);
|
pthread_mutex_unlock(cs->queue_mutex);
|
||||||
|
|
||||||
|
|
||||||
uint16_t fsize = ((cs->audio_decoder_sample_rate * cs->audio_decoder_frame_duration) / 1000);
|
uint16_t fsize = ((cs->audio_decoder_sample_rate * cs->audio_decoder_frame_duration) / 1000);
|
||||||
int16_t tmp[fsize * cs->audio_decoder_channels];
|
int16_t tmp[fsize * cs->audio_decoder_channels];
|
||||||
|
|
||||||
rc = opus_decode(cs->audio_decoder, p->data, p->size, tmp, fsize, (p->size == 0));
|
if (success == 2) {
|
||||||
free(p);
|
rc = opus_decode(cs->audio_decoder, 0, 0, tmp, fsize, 1);
|
||||||
|
} else {
|
||||||
|
rc = opus_decode(cs->audio_decoder, msg->data, msg->length, tmp, fsize, 0);
|
||||||
|
}
|
||||||
|
|
||||||
if (rc < 0)
|
if (rc < 0) {
|
||||||
LOGGER_WARNING("Decoding error: %s", opus_strerror(rc));
|
LOGGER_WARNING("Decoding error: %s", opus_strerror(rc));
|
||||||
else if (cs->acb.first)
|
} else if (cs->acb.first) {
|
||||||
/* Play */
|
/* Play */
|
||||||
cs->acb.first(cs->agent, cs->call_idx, tmp, rc, cs->acb.second);
|
cs->acb.first(cs->agent, cs->call_idx, tmp, rc, cs->acb.second);
|
||||||
|
}
|
||||||
|
|
||||||
pthread_mutex_lock(cs->queue_mutex);
|
pthread_mutex_lock(cs->queue_mutex);
|
||||||
}
|
}
|
||||||
|
@ -502,8 +504,6 @@ CSSession *cs_new(const ToxAvCSettings *cs_self, const ToxAvCSettings *cs_peer,
|
||||||
|
|
||||||
if ( !(cs->capabilities & cs_AudioEncoding) || !(cs->capabilities & cs_AudioDecoding) ) goto error;
|
if ( !(cs->capabilities & cs_AudioEncoding) || !(cs->capabilities & cs_AudioDecoding) ) goto error;
|
||||||
|
|
||||||
if ( !(cs->abuf_raw = buffer_new(jbuf_size)) ) goto error;
|
|
||||||
|
|
||||||
if ((cs->support_video = has_video)) {
|
if ((cs->support_video = has_video)) {
|
||||||
cs->max_video_frame_size = MAX_VIDEOFRAME_SIZE;
|
cs->max_video_frame_size = MAX_VIDEOFRAME_SIZE;
|
||||||
cs->video_frame_piece_size = VIDEOFRAME_PIECE_SIZE;
|
cs->video_frame_piece_size = VIDEOFRAME_PIECE_SIZE;
|
||||||
|
@ -529,8 +529,6 @@ error:
|
||||||
|
|
||||||
pthread_mutex_destroy(cs->queue_mutex);
|
pthread_mutex_destroy(cs->queue_mutex);
|
||||||
|
|
||||||
buffer_free(cs->abuf_raw);
|
|
||||||
|
|
||||||
if ( cs->audio_encoder ) opus_encoder_destroy(cs->audio_encoder);
|
if ( cs->audio_encoder ) opus_encoder_destroy(cs->audio_encoder);
|
||||||
|
|
||||||
if ( cs->audio_decoder ) opus_decoder_destroy(cs->audio_decoder);
|
if ( cs->audio_decoder ) opus_decoder_destroy(cs->audio_decoder);
|
||||||
|
@ -574,7 +572,6 @@ void cs_kill(CSSession *cs)
|
||||||
vpx_codec_destroy(&cs->v_encoder);
|
vpx_codec_destroy(&cs->v_encoder);
|
||||||
|
|
||||||
jbuf_free(cs->j_buf);
|
jbuf_free(cs->j_buf);
|
||||||
buffer_free(cs->abuf_raw);
|
|
||||||
buffer_free(cs->vbuf_raw);
|
buffer_free(cs->vbuf_raw);
|
||||||
free(cs->frame_buf);
|
free(cs->frame_buf);
|
||||||
|
|
||||||
|
@ -597,37 +594,9 @@ void queue_message(RTPSession *session, RTPMessage *msg)
|
||||||
|
|
||||||
/* Audio */
|
/* Audio */
|
||||||
if (session->payload_type == msi_TypeAudio % 128) {
|
if (session->payload_type == msi_TypeAudio % 128) {
|
||||||
|
pthread_mutex_lock(cs->queue_mutex);
|
||||||
jbuf_write(cs->j_buf, msg);
|
jbuf_write(cs->j_buf, msg);
|
||||||
|
pthread_mutex_unlock(cs->queue_mutex);
|
||||||
int success = 0;
|
|
||||||
|
|
||||||
while ((msg = jbuf_read(cs->j_buf, &success)) || success == 2) {
|
|
||||||
Payload *p;
|
|
||||||
|
|
||||||
if (success == 2) {
|
|
||||||
p = malloc(sizeof(Payload));
|
|
||||||
|
|
||||||
if (p) p->size = 0;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
p = malloc(sizeof(Payload) + msg->length);
|
|
||||||
|
|
||||||
if (p) {
|
|
||||||
p->size = msg->length;
|
|
||||||
memcpy(p->data, msg->data, msg->length);
|
|
||||||
}
|
|
||||||
|
|
||||||
rtp_free_msg(NULL, msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (p) {
|
|
||||||
pthread_mutex_lock(cs->queue_mutex);
|
|
||||||
buffer_write(cs->abuf_raw, p);
|
|
||||||
pthread_mutex_unlock(cs->queue_mutex);
|
|
||||||
} else {
|
|
||||||
LOGGER_WARNING("Allocation failed! Program might misbehave!");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
/* Video */
|
/* Video */
|
||||||
else {
|
else {
|
||||||
|
|
|
@ -144,7 +144,7 @@ typedef struct _CSSession {
|
||||||
PAIR(CSVideoCallback, void *) vcb;
|
PAIR(CSVideoCallback, void *) vcb;
|
||||||
|
|
||||||
/* Buffering */
|
/* Buffering */
|
||||||
void *abuf_raw, *vbuf_raw; /* Un-decoded data */
|
void *vbuf_raw; /* Un-decoded data */
|
||||||
pthread_mutex_t queue_mutex[1];
|
pthread_mutex_t queue_mutex[1];
|
||||||
|
|
||||||
void *agent; /* Pointer to ToxAv */
|
void *agent; /* Pointer to ToxAv */
|
||||||
|
|
Loading…
Reference in New Issue
Block a user