*** app_jack_original.c 2009-10-06 11:19:38.000000000 +0200 --- app_jack.c 2009-10-06 10:20:15.000000000 +0200 *************** *** 247,260 **** } for (i = 0; i < total_out_buf_used; i++) ! s_buf[i] = f_buf[i] * (SHRT_MAX / 1.0); write_len = total_out_buf_used * sizeof(int16_t); } else { /* No resampling needed */ for (i = 0; i < nframes; i++) ! s_buf[i] = in_buf[i] * (SHRT_MAX / 1.0); } res = jack_ringbuffer_write(jack_data->input_rb, (const char *) s_buf, write_len); --- 247,260 ---- } for (i = 0; i < total_out_buf_used; i++) ! s_buf[i] = ((float) f_buf[i]) * ((float) SHRT_MAX); write_len = total_out_buf_used * sizeof(int16_t); } else { /* No resampling needed */ for (i = 0; i < nframes; i++) ! s_buf[i] = ((float) in_buf[i]) * ((float) SHRT_MAX); } res = jack_ringbuffer_write(jack_data->input_rb, (const char *) s_buf, write_len); *************** *** 370,376 **** ast_channel_unlock(chan); } ! if (!(jack_data->output_rb = jack_ringbuffer_create(RINGBUFFER_SIZE))) return -1; if (!(jack_data->input_rb = jack_ringbuffer_create(RINGBUFFER_SIZE))) --- 370,376 ---- ast_channel_unlock(chan); } ! if (!(jack_data->output_rb = jack_ringbuffer_create(RINGBUFFER_SIZE * 2))) return -1; if (!(jack_data->input_rb = jack_ringbuffer_create(RINGBUFFER_SIZE))) *************** *** 492,511 **** int16_t *s_buf = f->data.ptr; size_t res; ! memset(f_buf, 0, sizeof(f_buf)); if (!jack_data->output_resample_factor) alloc_resampler(jack_data, 0); ! if (jack_data->output_resampler) { float in_buf[f->samples]; int total_in_buf_used = 0; int total_out_buf_used = 0; ! memset(in_buf, 0, sizeof(in_buf)); for (i = 0; i < f->samples; i++) ! in_buf[i] = s_buf[i] * (1.0 / SHRT_MAX); while (total_in_buf_used < ARRAY_LEN(in_buf)) { int in_buf_used; --- 492,513 ---- int16_t *s_buf = f->data.ptr; size_t res; ! // memset(f_buf, 0, sizeof(f_buf)); // not needed if no resample if (!jack_data->output_resample_factor) alloc_resampler(jack_data, 0); ! if (jack_data->output_resampler) { float in_buf[f->samples]; int total_in_buf_used = 0; int total_out_buf_used = 0; ! memset(f_buf, 0, sizeof(f_buf)); ! ! // memset(in_buf, 0, sizeof(in_buf)); // not needed (see the next for) for (i = 0; i < f->samples; i++) ! in_buf[i] = ((float) s_buf[i]) / ((float) SHRT_MAX); while (total_in_buf_used < ARRAY_LEN(in_buf)) { int in_buf_used; *************** *** 536,542 **** /* No resampling needed */ for (i = 0; i < f->samples; i++) ! f_buf[i] = s_buf[i] * (1.0 / SHRT_MAX); f_buf_used = f->samples; } --- 538,544 ---- /* No resampling needed */ for (i = 0; i < f->samples; i++) ! f_buf[i] = ((float) s_buf[i]) / ((float) SHRT_MAX); f_buf_used = f->samples; } *************** *** 797,811 **** if (audiohook->status == AST_AUDIOHOOK_STATUS_DONE) return 0; - if (direction != AST_AUDIOHOOK_DIRECTION_READ) - return 0; - if (frame->frametype != AST_FRAME_VOICE) return 0; ! if (frame->subclass != AST_FORMAT_SLINEAR) { ast_log(LOG_WARNING, "Expected frame in SLINEAR for the audiohook, but got format %d\n", ! frame->subclass); return 0; } --- 799,811 ---- if (audiohook->status == AST_AUDIOHOOK_STATUS_DONE) return 0; if (frame->frametype != AST_FRAME_VOICE) return 0; ! if (frame->subclass != AST_FORMAT_SLINEAR) ! { ast_log(LOG_WARNING, "Expected frame in SLINEAR for the audiohook, but got format %d\n", ! frame->subclass); return 0; } *************** *** 819,827 **** jack_data = datastore->data; ! queue_voice_frame(jack_data, frame); ! ! handle_jack_audio(chan, jack_data, frame); ast_channel_unlock(chan); --- 819,832 ---- jack_data = datastore->data; ! if (direction != AST_AUDIOHOOK_DIRECTION_READ) ! { ! queue_voice_frame(jack_data, frame); ! } ! else ! { ! handle_jack_audio(chan, jack_data, frame); ! } ast_channel_unlock(chan);