Fixed audio bug and added reason when terminating call

This commit is contained in:
mannol 2014-02-04 23:08:34 +01:00
parent 0a91084011
commit faaaa05206
5 changed files with 64 additions and 63 deletions

View File

@ -354,7 +354,7 @@ void *encode_video_thread(void *arg)
cs->webcam_decoder_ctx->pix_fmt, cs->webcam_decoder_ctx->width, cs->webcam_decoder_ctx->height, PIX_FMT_YUV420P,
SWS_BILINEAR, NULL, NULL, NULL);
while (!cs->quit && cs->send_video) {
while (cs->send_video) {
if (av_read_frame(cs->video_format_ctx, packet) < 0) {
printf("error reading frame\n");
@ -412,14 +412,14 @@ void *encode_video_thread(void *arg)
}
/* clean up codecs */
pthread_mutex_lock(&cs->avcodec_mutex_lock);
pthread_mutex_lock(&cs->ctrl_mutex);
av_free(buffer);
av_free(webcam_frame);
av_free(s_video_frame);
sws_freeContext(_phone->sws_ctx);
avcodec_close(cs->webcam_decoder_ctx);
avcodec_close(cs->video_encoder_ctx);
pthread_mutex_unlock(&cs->avcodec_mutex_lock);
pthread_mutex_unlock(&cs->ctrl_mutex);
pthread_exit ( NULL );
}
@ -436,7 +436,7 @@ void *encode_audio_thread(void *arg)
ALint sample = 0;
alcCaptureStart((ALCdevice*)_phone->audio_capture_device);
while (!cs->quit && cs->send_audio) {
while (cs->send_audio) {
alcGetIntegerv((ALCdevice*)_phone->audio_capture_device, ALC_CAPTURE_SAMPLES, (ALCsizei)sizeof(ALint), &sample);
if (sample >= frame_size) {
@ -454,11 +454,10 @@ void *encode_audio_thread(void *arg)
}
/* clean up codecs */
pthread_mutex_lock(&cs->avcodec_mutex_lock);
pthread_mutex_lock(&cs->ctrl_mutex);
alcCaptureStop((ALCdevice*)_phone->audio_capture_device);
alcCaptureCloseDevice((ALCdevice*)_phone->audio_capture_device);
pthread_mutex_unlock(&cs->avcodec_mutex_lock);
pthread_mutex_unlock(&cs->ctrl_mutex);
pthread_exit ( NULL );
}
@ -478,7 +477,7 @@ void *decode_video_thread(void *arg)
int width = 0;
int height = 0;
while (!cs->quit && cs->receive_video) {
while (cs->receive_video) {
r_msg = rtp_recv_msg ( _phone->_rtp_video );
if (r_msg) {
@ -508,10 +507,10 @@ void *decode_video_thread(void *arg)
printf("vend\n");
/* clean up codecs */
pthread_mutex_lock(&cs->avcodec_mutex_lock);
pthread_mutex_lock(&cs->ctrl_mutex);
av_free(r_video_frame);
avcodec_close(cs->video_decoder_ctx);
pthread_mutex_unlock(&cs->avcodec_mutex_lock);
pthread_mutex_unlock(&cs->ctrl_mutex);
pthread_exit ( NULL );
}
@ -544,6 +543,7 @@ void *decode_audio_thread(void *arg)
uint16_t zeros[frame_size];
memset(zeros, 0, frame_size);
opus_int16 PCM[frame_size];
int i;
for (i = 0; i < openal_buffers; ++i) {
@ -555,7 +555,7 @@ void *decode_audio_thread(void *arg)
if (alGetError() != AL_NO_ERROR) {
fprintf(stderr, "Error starting audio\n");
cs->quit = 1;
goto ending;
}
struct jitter_buffer *j_buf = NULL;
@ -566,9 +566,8 @@ void *decode_audio_thread(void *arg)
int dec_frame_len = 0;
opus_int16 PCM[frame_size];
while (!cs->quit && cs->receive_audio) {
while (cs->receive_audio) {
r_msg = rtp_recv_msg ( _phone->_rtp_audio );
@ -633,16 +632,18 @@ void *decode_audio_thread(void *arg)
usleep(1000);
}
/* clean up codecs */
pthread_mutex_lock(&cs->avcodec_mutex_lock);
/* clean up openal */
ending:
/* clean up codecs */
pthread_mutex_lock(&cs->ctrl_mutex);
alDeleteSources(1, &source);
alDeleteBuffers(openal_buffers, buffers);
alcMakeContextCurrent(NULL);
alcDestroyContext(ctx);
alcCloseDevice(dev);
pthread_mutex_unlock(&cs->avcodec_mutex_lock);
pthread_mutex_unlock(&cs->ctrl_mutex);
pthread_exit ( NULL );
}
@ -676,8 +677,6 @@ int phone_startmedia_loop ( av_session_t* _phone )
_phone->_msi->call->nonce_local
);
_phone->cs->quit = 0;
init_encoder(_phone->cs);
init_decoder(_phone->cs);
@ -699,6 +698,7 @@ int phone_startmedia_loop ( av_session_t* _phone )
return -1;
}
/* Only checks for last peer */
if ( _phone->_msi->call->type_peer[0] == type_video && 0 > event.rise(decode_video_thread, _phone) )
{
INFO("Error while starting decode_video_thread()");
@ -913,18 +913,18 @@ av_session_t* av_init_session()
_retu->_msi->agent_handler = _retu;
/* ------------------ */
msi_register_callback(callback_call_started, cb_onstart);
msi_register_callback(callback_call_canceled, cb_oncancel);
msi_register_callback(callback_call_rejected, cb_onreject);
msi_register_callback(callback_call_ended, cb_onend);
msi_register_callback(callback_recv_invite, cb_oninvite);
msi_register_callback(callback_call_started, MSI_OnStart);
msi_register_callback(callback_call_canceled, MSI_OnCancel);
msi_register_callback(callback_call_rejected, MSI_OnReject);
msi_register_callback(callback_call_ended, MSI_OnEnd);
msi_register_callback(callback_recv_invite, MSI_OnInvite);
msi_register_callback(callback_recv_ringing, cb_ringing);
msi_register_callback(callback_recv_starting, cb_starting);
msi_register_callback(callback_recv_ending, cb_ending);
msi_register_callback(callback_recv_ringing, MSI_OnRinging);
msi_register_callback(callback_recv_starting, MSI_OnStarting);
msi_register_callback(callback_recv_ending, MSI_OnEnding);
msi_register_callback(callback_recv_error, cb_error);
msi_register_callback(callback_requ_timeout, cb_timeout);
msi_register_callback(callback_recv_error, MSI_OnError);
msi_register_callback(callback_requ_timeout, MSI_OnTimeout);
/* ------------------ */
return _retu;
@ -1114,7 +1114,7 @@ void do_phone ( av_session_t* _phone )
break;
}
msi_reject(_phone->_msi);
msi_reject(_phone->_msi, NULL);
INFO("Call Rejected...");

View File

@ -345,8 +345,6 @@ int init_send_audio(codec_state *cs)
err = opus_encoder_ctl(cs->audio_encoder, OPUS_SET_COMPLEXITY(10));
err = opus_encoder_ctl(cs->audio_encoder, OPUS_SET_SIGNAL(OPUS_SIGNAL_VOICE));
opus_encoder_init(cs->audio_encoder, AUDIO_SAMPLE_RATE, 1, OPUS_APPLICATION_VOIP);
int nfo;
err = opus_encoder_ctl(cs->audio_encoder, OPUS_GET_LOOKAHEAD(&nfo));
/* printf("Encoder lookahead delay : %d\n", nfo); */
@ -362,8 +360,7 @@ int init_encoder(codec_state *cs)
avdevice_register_all();
av_register_all();
pthread_mutex_init(&cs->rtp_msg_mutex_lock, NULL);
pthread_mutex_init(&cs->avcodec_mutex_lock, NULL);
pthread_mutex_init(&cs->ctrl_mutex, NULL);
cs->support_send_video = init_send_video(cs);
cs->support_send_audio = init_send_audio(cs);

View File

@ -108,10 +108,8 @@ typedef struct {
uint8_t req_video_refresh;
pthread_mutex_t rtp_msg_mutex_lock;
pthread_mutex_t avcodec_mutex_lock;
pthread_mutex_t ctrl_mutex;
uint8_t quit;
uint32_t frame_rate;

View File

@ -633,7 +633,7 @@ int handle_error ( MSISession* session, MSICallError errid, uint32_t to ) {
session->last_error_id = errid;
session->last_error_str = stringify_error ( errid );
event.rise ( callbacks[cb_error], session );
event.rise ( callbacks[MSI_OnError], session );
return 0;
}
@ -688,8 +688,8 @@ void* handle_timeout ( void* arg )
}
( *callbacks[cb_timeout] ) ( arg );
( *callbacks[cb_ending ] ) ( arg );
( *callbacks[MSI_OnTimeout] ) ( arg );
( *callbacks[MSI_OnEnding ] ) ( arg );
return NULL;
}
@ -821,7 +821,7 @@ int handle_recv_invite ( MSISession* session, MSIMessage* msg ) {
send_message ( session, _msg_ringing, msg->friend_id );
free_message ( _msg_ringing );
event.rise ( callbacks[cb_oninvite], session );
event.rise ( callbacks[MSI_OnInvite], session );
return 1;
}
@ -844,7 +844,7 @@ int handle_recv_start ( MSISession* session, MSIMessage* msg ) {
flush_peer_type ( session, msg, 0 );
event.rise ( callbacks[cb_onstart], session );
event.rise ( callbacks[MSI_OnStart], session );
return 1;
}
@ -860,7 +860,7 @@ int handle_recv_reject ( MSISession* session, MSIMessage* msg ) {
free_message ( _msg_end );
event.timer_release ( session->call->request_timer_id );
event.rise ( callbacks[cb_onreject], session );
event.rise ( callbacks[MSI_OnReject], session );
session->call->request_timer_id = event.timer_alloc ( handle_timeout, session, m_deftout );
return 1;
@ -874,7 +874,7 @@ int handle_recv_cancel ( MSISession* session, MSIMessage* msg ) {
terminate_call ( session );
event.rise ( callbacks[cb_oncancel], session );
event.rise ( callbacks[MSI_OnCancel], session );
return 1;
}
@ -891,7 +891,7 @@ int handle_recv_end ( MSISession* session, MSIMessage* msg ) {
terminate_call ( session );
event.rise ( callbacks[cb_onend], session );
event.rise ( callbacks[MSI_OnEnd], session );
return 1;
}
@ -904,7 +904,7 @@ int handle_recv_ringing ( MSISession* session, MSIMessage* msg ) {
return 0;
session->call->ringing_timer_id = event.timer_alloc ( handle_timeout, session, session->call->ringing_tout_ms );
event.rise ( callbacks[cb_ringing], session );
event.rise ( callbacks[MSI_OnRinging], session );
return 1;
}
@ -942,7 +942,7 @@ int handle_recv_starting ( MSISession* session, MSIMessage* msg ) {
flush_peer_type ( session, msg, 0 );
event.rise ( callbacks[cb_starting], session );
event.rise ( callbacks[MSI_OnStarting], session );
event.timer_release ( session->call->ringing_timer_id );
return 1;
@ -956,7 +956,7 @@ int handle_recv_ending ( MSISession* session, MSIMessage* msg ) {
terminate_call ( session );
event.rise ( callbacks[cb_ending], session );
event.rise ( callbacks[MSI_OnEnding], session );
return 1;
}
@ -972,7 +972,7 @@ int handle_recv_error ( MSISession* session, MSIMessage* msg ) {
terminate_call ( session );
event.rise ( callbacks[cb_ending], session );
event.rise ( callbacks[MSI_OnEnding], session );
return 1;
}
@ -1165,6 +1165,8 @@ int msi_terminate_session ( MSISession* session ) {
int _status = 0;
terminate_call ( session );
m_callback_msi_packet((struct Messenger*) session->messenger_handle, NULL, NULL);
/* TODO: Clean it up more? */
@ -1311,10 +1313,13 @@ int msi_cancel ( MSISession* session, int friend_id ) {
* @param session Control session.
* @return int
*/
int msi_reject ( MSISession* session ) {
int msi_reject ( MSISession* session, const uint8_t* reason ) {
assert ( session );
MSIMessage* _msg_reject = msi_new_message ( TYPE_REQUEST, stringify_request ( reject ) );
if ( reason ) msi_msg_set_reason(_msg_reject, reason, strlen((const char*)reason) + 1);
send_message ( session, _msg_reject, session->call->peers[session->call->peer_count - 1] );
free_message ( _msg_reject );

View File

@ -120,20 +120,20 @@ typedef struct _MSISession {
*/
typedef enum {
/* Requests */
cb_oninvite,
cb_onstart,
cb_oncancel,
cb_onreject,
cb_onend,
MSI_OnInvite,
MSI_OnStart,
MSI_OnCancel,
MSI_OnReject,
MSI_OnEnd,
/* Responses */
cb_ringing,
cb_starting,
cb_ending,
MSI_OnRinging,
MSI_OnStarting,
MSI_OnEnding,
/* Protocol */
cb_error,
cb_timeout
MSI_OnError,
MSI_OnTimeout
} MSICallbackID;
@ -215,9 +215,10 @@ int msi_cancel ( MSISession* session, int friend_id );
* @brief Reject request.
*
* @param session Control session.
* @param reason Set optional reason header. Pass NULL if none.
* @return int
*/
int msi_reject ( MSISession* session );
int msi_reject ( MSISession* session, const uint8_t* reason );
/**