00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "JackLibSampleRateResampler.h"
00021 #include "JackError.h"
00022
00023 namespace Jack
00024 {
00025
00026 JackLibSampleRateResampler::JackLibSampleRateResampler()
00027 :JackResampler()
00028 {
00029 int error;
00030 fResampler = src_new(SRC_LINEAR, 1, &error);
00031 if (error != 0) {
00032 jack_error("JackLibSampleRateResampler::JackLibSampleRateResampler err = %s", src_strerror(error));
00033 }
00034 }
00035
00036 JackLibSampleRateResampler::JackLibSampleRateResampler(unsigned int quality)
00037 :JackResampler()
00038 {
00039 switch (quality) {
00040 case 0:
00041 quality = SRC_LINEAR;
00042 break;
00043 case 1:
00044 quality = SRC_ZERO_ORDER_HOLD;
00045 break;
00046 case 2:
00047 quality = SRC_SINC_FASTEST;
00048 break;
00049 case 3:
00050 quality = SRC_SINC_MEDIUM_QUALITY;
00051 break;
00052 case 4:
00053 quality = SRC_SINC_BEST_QUALITY;
00054 break;
00055 default:
00056 quality = SRC_LINEAR;
00057 jack_error("Out of range resample quality");
00058 break;
00059 }
00060
00061 int error;
00062 fResampler = src_new(quality, 1, &error);
00063 if (error != 0) {
00064 jack_error("JackLibSampleRateResampler::JackLibSampleRateResampler err = %s", src_strerror(error));
00065 }
00066 }
00067
00068 JackLibSampleRateResampler::~JackLibSampleRateResampler()
00069 {
00070 src_delete(fResampler);
00071 }
00072
00073 void JackLibSampleRateResampler::Reset(unsigned int new_size)
00074 {
00075 JackResampler::Reset(new_size);
00076 src_reset(fResampler);
00077 }
00078
00079 unsigned int JackLibSampleRateResampler::ReadResample(jack_default_audio_sample_t* buffer, unsigned int frames)
00080 {
00081 jack_ringbuffer_data_t ring_buffer_data[2];
00082 SRC_DATA src_data;
00083 unsigned int frames_to_write = frames;
00084 unsigned int written_frames = 0;
00085 int res;
00086
00087 jack_ringbuffer_get_read_vector(fRingBuffer, ring_buffer_data);
00088 unsigned int available_frames = (ring_buffer_data[0].len + ring_buffer_data[1].len) / sizeof(jack_default_audio_sample_t);
00089 jack_log("Output available = %ld", available_frames);
00090
00091 for (int j = 0; j < 2; j++) {
00092
00093 if (ring_buffer_data[j].len > 0) {
00094
00095 src_data.data_in = (jack_default_audio_sample_t*)ring_buffer_data[j].buf;
00096 src_data.data_out = &buffer[written_frames];
00097 src_data.input_frames = ring_buffer_data[j].len / sizeof(jack_default_audio_sample_t);
00098 src_data.output_frames = frames_to_write;
00099 src_data.end_of_input = 0;
00100 src_data.src_ratio = fRatio;
00101
00102 res = src_process(fResampler, &src_data);
00103 if (res != 0) {
00104 jack_error("JackLibSampleRateResampler::ReadResample ratio = %f err = %s", fRatio, src_strerror(res));
00105 return 0;
00106 }
00107
00108 frames_to_write -= src_data.output_frames_gen;
00109 written_frames += src_data.output_frames_gen;
00110
00111 if ((src_data.input_frames_used == 0 || src_data.output_frames_gen == 0) && j == 0) {
00112 jack_log("Output : j = %d input_frames_used = %ld output_frames_gen = %ld frames1 = %lu frames2 = %lu"
00113 , j, src_data.input_frames_used, src_data.output_frames_gen, ring_buffer_data[0].len, ring_buffer_data[1].len);
00114 }
00115
00116 jack_log("Output : j = %d input_frames_used = %ld output_frames_gen = %ld", j, src_data.input_frames_used, src_data.output_frames_gen);
00117 jack_ringbuffer_read_advance(fRingBuffer, src_data.input_frames_used * sizeof(jack_default_audio_sample_t));
00118 }
00119 }
00120
00121 if (written_frames < frames) {
00122 jack_error("Output available = %ld", available_frames);
00123 jack_error("JackLibSampleRateResampler::ReadResample error written_frames = %ld", written_frames);
00124 }
00125
00126 return written_frames;
00127 }
00128
00129 unsigned int JackLibSampleRateResampler::WriteResample(jack_default_audio_sample_t* buffer, unsigned int frames)
00130 {
00131 jack_ringbuffer_data_t ring_buffer_data[2];
00132 SRC_DATA src_data;
00133 unsigned int frames_to_read = frames;
00134 unsigned int read_frames = 0;
00135 int res;
00136
00137 jack_ringbuffer_get_write_vector(fRingBuffer, ring_buffer_data);
00138 unsigned int available_frames = (ring_buffer_data[0].len + ring_buffer_data[1].len) / sizeof(jack_default_audio_sample_t);
00139 jack_log("Input available = %ld", available_frames);
00140
00141 for (int j = 0; j < 2; j++) {
00142
00143 if (ring_buffer_data[j].len > 0) {
00144
00145 src_data.data_in = &buffer[read_frames];
00146 src_data.data_out = (jack_default_audio_sample_t*)ring_buffer_data[j].buf;
00147 src_data.input_frames = frames_to_read;
00148 src_data.output_frames = (ring_buffer_data[j].len / sizeof(jack_default_audio_sample_t));
00149 src_data.end_of_input = 0;
00150 src_data.src_ratio = fRatio;
00151
00152 res = src_process(fResampler, &src_data);
00153 if (res != 0) {
00154 jack_error("JackLibSampleRateResampler::WriteResample ratio = %f err = %s", fRatio, src_strerror(res));
00155 return 0;
00156 }
00157
00158 frames_to_read -= src_data.input_frames_used;
00159 read_frames += src_data.input_frames_used;
00160
00161 if ((src_data.input_frames_used == 0 || src_data.output_frames_gen == 0) && j == 0) {
00162 jack_log("Input : j = %d input_frames_used = %ld output_frames_gen = %ld frames1 = %lu frames2 = %lu"
00163 , j, src_data.input_frames_used, src_data.output_frames_gen, ring_buffer_data[0].len, ring_buffer_data[1].len);
00164 }
00165
00166 jack_log("Input : j = %d input_frames_used = %ld output_frames_gen = %ld", j, src_data.input_frames_used, src_data.output_frames_gen);
00167 jack_ringbuffer_write_advance(fRingBuffer, src_data.output_frames_gen * sizeof(jack_default_audio_sample_t));
00168 }
00169 }
00170
00171 if (read_frames < frames) {
00172 jack_error("Input available = %ld", available_frames);
00173 jack_error("JackLibSampleRateResampler::WriteResample error read_frames = %ld", read_frames);
00174 }
00175
00176 return read_frames;
00177 }
00178
00179 }