Jack2 1.9.8
|
00001 /* 00002 Copyright (C) 2008 Grame 00003 00004 This program is free software; you can redistribute it and/or modify 00005 it under the terms of the GNU General Public License as published by 00006 the Free Software Foundation; either version 2 of the License, or 00007 (at your option) any later version. 00008 00009 This program is distributed in the hope that it will be useful, 00010 but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00012 GNU General Public License for more details. 00013 00014 You should have received a copy of the GNU General Public License 00015 along with this program; if not, write to the Free Software 00016 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 00017 00018 */ 00019 00020 #include "JackResampler.h" 00021 #include <stdio.h> 00022 00023 namespace Jack 00024 { 00025 00026 JackResampler::JackResampler() 00027 :fRatio(1), fRingBufferSize(DEFAULT_RB_SIZE) 00028 { 00029 fRingBuffer = jack_ringbuffer_create(sizeof(jack_default_audio_sample_t) * fRingBufferSize); 00030 jack_ringbuffer_read_advance(fRingBuffer, (sizeof(jack_default_audio_sample_t) * fRingBufferSize) / 2); 00031 } 00032 00033 JackResampler::~JackResampler() 00034 { 00035 if (fRingBuffer) { 00036 jack_ringbuffer_free(fRingBuffer); 00037 } 00038 } 00039 00040 void JackResampler::Reset(unsigned int new_size) 00041 { 00042 fRingBufferSize = new_size; 00043 jack_ringbuffer_reset(fRingBuffer); 00044 jack_ringbuffer_reset_size(fRingBuffer, sizeof(jack_default_audio_sample_t) * fRingBufferSize); 00045 jack_ringbuffer_read_advance(fRingBuffer, (sizeof(jack_default_audio_sample_t) * fRingBufferSize / 2)); 00046 } 00047 00048 unsigned int JackResampler::ReadSpace() 00049 { 00050 return (jack_ringbuffer_read_space(fRingBuffer) / sizeof(jack_default_audio_sample_t)); 00051 } 00052 00053 unsigned int JackResampler::WriteSpace() 00054 { 00055 return (jack_ringbuffer_write_space(fRingBuffer) / sizeof(jack_default_audio_sample_t)); 00056 } 00057 00058 unsigned int JackResampler::Read(jack_default_audio_sample_t* buffer, unsigned int frames) 00059 { 00060 size_t len = jack_ringbuffer_read_space(fRingBuffer); 00061 jack_log("JackResampler::Read input available = %ld", len / sizeof(jack_default_audio_sample_t)); 00062 00063 if (len < frames * sizeof(jack_default_audio_sample_t)) { 00064 jack_error("JackResampler::Read : producer too slow, missing frames = %d", frames); 00065 return 0; 00066 } else { 00067 jack_ringbuffer_read(fRingBuffer, (char*)buffer, frames * sizeof(jack_default_audio_sample_t)); 00068 return frames; 00069 } 00070 } 00071 00072 unsigned int JackResampler::Write(jack_default_audio_sample_t* buffer, unsigned int frames) 00073 { 00074 size_t len = jack_ringbuffer_write_space(fRingBuffer); 00075 jack_log("JackResampler::Write output available = %ld", len / sizeof(jack_default_audio_sample_t)); 00076 00077 if (len < frames * sizeof(jack_default_audio_sample_t)) { 00078 jack_error("JackResampler::Write : consumer too slow, skip frames = %d", frames); 00079 return 0; 00080 } else { 00081 jack_ringbuffer_write(fRingBuffer, (char*)buffer, frames * sizeof(jack_default_audio_sample_t)); 00082 return frames; 00083 } 00084 } 00085 00086 unsigned int JackResampler::Read(void* buffer, unsigned int bytes) 00087 { 00088 size_t len = jack_ringbuffer_read_space(fRingBuffer); 00089 jack_log("JackResampler::Read input available = %ld", len); 00090 00091 if (len < bytes) { 00092 jack_error("JackResampler::Read : producer too slow, missing bytes = %d", bytes); 00093 return 0; 00094 } else { 00095 jack_ringbuffer_read(fRingBuffer, (char*)buffer, bytes); 00096 return bytes; 00097 } 00098 } 00099 00100 unsigned int JackResampler::Write(void* buffer, unsigned int bytes) 00101 { 00102 size_t len = jack_ringbuffer_write_space(fRingBuffer); 00103 jack_log("JackResampler::Write output available = %ld", len); 00104 00105 if (len < bytes) { 00106 jack_error("JackResampler::Write : consumer too slow, skip bytes = %d", bytes); 00107 return 0; 00108 } else { 00109 jack_ringbuffer_write(fRingBuffer, (char*)buffer, bytes); 00110 return bytes; 00111 } 00112 } 00113 00114 unsigned int JackResampler::ReadResample(jack_default_audio_sample_t* buffer, unsigned int frames) 00115 { 00116 return Read(buffer, frames); 00117 } 00118 00119 unsigned int JackResampler::WriteResample(jack_default_audio_sample_t* buffer, unsigned int frames) 00120 { 00121 return Write(buffer, frames); 00122 } 00123 00124 }