diff options
| author | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2016-04-01 11:46:05 +0000 |
|---|---|---|
| committer | trialuser02 <trialuser02@90c681e8-e032-0410-971d-27865f9a5e38> | 2016-04-01 11:46:05 +0000 |
| commit | af32dbd850a3c6bf548d3ec4bdb82030f13aea0a (patch) | |
| tree | 46eb414c8c91f1d006f9344873c3f37372b8beb2 /src | |
| parent | af59f0d2fcf4b99a61e19cd017800b648096377e (diff) | |
| download | qmmp-af32dbd850a3c6bf548d3ec4bdb82030f13aea0a.tar.gz qmmp-af32dbd850a3c6bf548d3ec4bdb82030f13aea0a.tar.bz2 qmmp-af32dbd850a3c6bf548d3ec4bdb82030f13aea0a.zip | |
jack: removed libsamplerate dependency (using soxr instead)
git-svn-id: http://svn.code.sf.net/p/qmmp-dev/code/trunk/qmmp@6215 90c681e8-e032-0410-971d-27865f9a5e38
Diffstat (limited to 'src')
| -rw-r--r-- | src/plugins/Output/jack/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | src/plugins/Output/jack/bio2jack.c | 107 | ||||
| -rw-r--r-- | src/plugins/Output/jack/bio2jack.h | 8 | ||||
| -rw-r--r-- | src/plugins/Output/jack/jack.pro | 2 |
4 files changed, 49 insertions, 70 deletions
diff --git a/src/plugins/Output/jack/CMakeLists.txt b/src/plugins/Output/jack/CMakeLists.txt index 29e28eae7..848206f74 100644 --- a/src/plugins/Output/jack/CMakeLists.txt +++ b/src/plugins/Output/jack/CMakeLists.txt @@ -28,7 +28,7 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../../) link_directories(${CMAKE_CURRENT_BINARY_DIR}/../../../qmmp) # libjack and samplerate -pkg_check_modules(JACK jack samplerate) +pkg_check_modules(JACK jack soxr) include_directories(${JACK_INCLUDE_DIRS}) link_directories(${JACK_LIBRARY_DIRS}) diff --git a/src/plugins/Output/jack/bio2jack.c b/src/plugins/Output/jack/bio2jack.c index 677bc2017..3ef41db0d 100644 --- a/src/plugins/Output/jack/bio2jack.c +++ b/src/plugins/Output/jack/bio2jack.c @@ -31,7 +31,7 @@ #include <jack/ringbuffer.h> #include <pthread.h> #include <sys/time.h> -#include <samplerate.h> +#include <soxr.h> #include "bio2jack.h" @@ -167,8 +167,8 @@ typedef struct jack_driver_s jack_ringbuffer_t *pPlayPtr; /* the playback ringbuffer */ jack_ringbuffer_t *pRecPtr; /* the recording ringbuffer */ - SRC_STATE *output_src; /* SRC object for the output stream */ - SRC_STATE *input_src; /* SRC object for the output stream */ + soxr_t output_src; /* resampler object for the output stream */ + soxr_t input_src; /* resampler object for the input stream */ enum status_enum state; /* one of PLAYING, PAUSED, STOPPED, CLOSED, RESET etc */ @@ -200,7 +200,7 @@ static bool do_sample_rate_conversion; /* whether the client has requested samp Which SRC converter function we should use when doing sample rate conversion. Default to the fastest of the 'good quality' set. */ -static int preferred_src_converter = SRC_SINC_FASTEST; +//static int preferred_src_converter = SRC_SINC_FASTEST; static bool init_done = 0; /* just to prevent clients from calling JACK_Init twice, that would be very bad */ @@ -505,7 +505,7 @@ JACK_callback(nframes_t nframes, void *arg) jack_driver_t *drv = (jack_driver_t *) arg; unsigned int i; - int src_error = 0; + soxr_error_t src_error = 0; TIMER("start\n"); gettimeofday(&drv->previousTime, 0); /* record the current time */ @@ -606,31 +606,22 @@ JACK_callback(nframes_t nframes, void *arg) jack_ringbuffer_peek(drv->pPlayPtr, drv->callback_buffer1, bytes_needed_read); - SRC_DATA srcdata; - srcdata.data_in = (sample_t *) drv->callback_buffer1; - srcdata.input_frames = bytes_needed_read / drv->bytes_per_jack_output_frame; - srcdata.src_ratio = drv->output_sample_rate_ratio; - srcdata.data_out = (sample_t *) drv->callback_buffer2; - srcdata.output_frames = nframes; - srcdata.end_of_input = 0; // it's a stream, it never ends - DEBUG("input_frames = %ld, output_frames = %ld\n", - srcdata.input_frames, srcdata.output_frames); - /* convert the sample rate */ - src_error = src_process(drv->output_src, &srcdata); - DEBUG("used = %ld, generated = %ld, error = %d: %s.\n", - srcdata.input_frames_used, srcdata.output_frames_gen, - src_error, src_strerror(src_error)); + size_t o_done = 0, i_done = 0; + + src_error = soxr_process(drv->output_src, + drv->callback_buffer1, + bytes_needed_read / drv->bytes_per_jack_output_frame, &i_done, + drv->callback_buffer2, nframes, &o_done); if(src_error == 0) { /* now we can move the read pointer */ jack_ringbuffer_read_advance(drv->pPlayPtr, - srcdata. - input_frames_used * + i_done * drv->bytes_per_jack_output_frame); /* add on what we wrote */ - read = srcdata.input_frames_used * drv->bytes_per_output_frame; - jackFramesAvailable -= srcdata.output_frames_gen; /* take away what was used */ + read = i_done * drv->bytes_per_output_frame; + jackFramesAvailable -= o_done; /* take away what was used */ } } } @@ -737,25 +728,18 @@ JACK_callback(nframes_t nframes, void *arg) return 1; } - SRC_DATA srcdata; - srcdata.data_in = (sample_t *) drv->callback_buffer1; - srcdata.input_frames = nframes; - srcdata.src_ratio = drv->input_sample_rate_ratio; - srcdata.data_out = (sample_t *) drv->callback_buffer2; - srcdata.output_frames = drv->callback_buffer2_size / drv->bytes_per_jack_input_frame; - srcdata.end_of_input = 0; // it's a stream, it never ends - DEBUG("input_frames = %ld, output_frames = %ld\n", - srcdata.input_frames, srcdata.output_frames); - /* convert the sample rate */ - src_error = src_process(drv->input_src, &srcdata); - DEBUG("used = %ld, generated = %ld, error = %d: %s.\n", - srcdata.input_frames_used, srcdata.output_frames_gen, - src_error, src_strerror(src_error)); + size_t o_done = 0, i_done = 0; + + src_error = soxr_process(drv->input_src, + drv->callback_buffer1, + nframes, &i_done, + drv->callback_buffer2, + drv->callback_buffer2_size / drv->bytes_per_jack_input_frame, &o_done); if(src_error == 0) { long write_space = jack_ringbuffer_write_space(drv->pRecPtr); - long bytes_used = srcdata.output_frames_gen * drv->bytes_per_jack_input_frame; + long bytes_used = o_done * drv->bytes_per_jack_input_frame; /* if there isn't enough room, make some. sure this discards data, but when dealing with input sources it seems like it's better to throw away old data than new */ if(write_space < bytes_used) @@ -881,12 +865,17 @@ JACK_srate(nframes_t nframes, void *arg) drv->jack_sample_rate = (long) nframes; - /* make sure to recalculate the ratios needed for proper sample rate conversion */ - drv->output_sample_rate_ratio = (double) drv->jack_sample_rate / (double) drv->client_sample_rate; - if(drv->output_src) src_set_ratio(drv->output_src, drv->output_sample_rate_ratio); + if(drv->output_src) + { + soxr_delete(drv->output_src); + drv->output_src = soxr_create(drv->client_sample_rate, drv->jack_sample_rate, drv->num_output_channels, 0, 0, 0, 0); + } - drv->input_sample_rate_ratio = (double) drv->client_sample_rate / (double) drv->jack_sample_rate; - if(drv->input_src) src_set_ratio(drv->input_src, drv->input_sample_rate_ratio); + if(drv->input_src) + { + soxr_delete(drv->input_src); + drv->input_src =soxr_create(drv->jack_sample_rate, drv->client_sample_rate, drv->num_input_channels, 0, 0, 0, 0); + } TRACE("the sample rate is now %lu/sec\n", (long) nframes); return 0; @@ -1609,27 +1598,28 @@ JACK_OpenEx(int *deviceID, unsigned int bits_per_channel, /* setup SRC objects just in case they'll be needed but only if requested */ if(do_sample_rate_conversion) { - int error; + soxr_error_t error; if(drv->num_output_channels > 0) { - drv->output_src = src_new(preferred_src_converter, drv->num_output_channels, &error); + drv->output_src = soxr_create(drv->client_sample_rate, drv->jack_sample_rate, drv->num_output_channels, &error, 0, 0, 0); + if(error != 0) { - src_delete(drv->output_src); + soxr_delete(drv->output_src); drv->output_src = 0; - ERR("Could not created SRC object for output stream %d: %s\n", - error, src_strerror(error)); + //ERR("Could not created SRC object for output stream %d: %s\n", + // error, src_strerror(error)); } } if(drv->num_input_channels > 0) { - drv->input_src = src_new(preferred_src_converter, drv->num_input_channels, &error); + drv->input_src = soxr_create(drv->jack_sample_rate, drv->client_sample_rate, drv->num_input_channels, &error, 0, 0, 0); if(error != 0) { - src_delete(drv->input_src); + soxr_delete(drv->input_src); drv->input_src = 0; - ERR("Could not created SRC object for input stream %d: %s\n", - error, src_strerror(error)); + //ERR("Could not created SRC object for input stream %d: %s\n", + // error, src_strerror(error)); } } } @@ -1732,10 +1722,10 @@ JACK_Close(int deviceID) drv->pRecPtr = 0; /* free the SRC objects */ - if(drv->output_src) src_delete(drv->output_src); + if(drv->output_src) soxr_delete(drv->output_src); drv->output_src = 0; - if(drv->input_src) src_delete(drv->input_src); + if(drv->input_src) soxr_delete(drv->input_src); drv->input_src = 0; drv->allocated = FALSE; /* release this device */ @@ -2633,15 +2623,6 @@ JACK_DoSampleRateConversion(bool value) do_sample_rate_conversion = value; } -/* FIXME: put the filename of the resample library header file with the decoders in here */ -/* consider mapping them in the bio2jack.h header file since its useless to the user unless */ -/* they can figure out wtf the settings on */ -void -JACK_SetSampleRateConversionFunction(int converter) -{ - preferred_src_converter = converter; -} - /* set the client name that will be reported to jack when we open a */ /* connection via JACK_OpenDevice() */ void diff --git a/src/plugins/Output/jack/bio2jack.h b/src/plugins/Output/jack/bio2jack.h index f81a7c777..50fbb54b4 100644 --- a/src/plugins/Output/jack/bio2jack.h +++ b/src/plugins/Output/jack/bio2jack.h @@ -58,11 +58,9 @@ enum pos_enum { BYTES, MILLISECONDS }; void JACK_Init(void); /* call this before any other bio2jack calls */ void JACK_DoSampleRateConversion(bool value); /* whether the next device that's Open()d should do sample rate conversion if necessary */ -void JACK_SetSampleRateConversionFunction(int converter); /* which SRC converter function should be used - for the next Open()d device */ int JACK_Open(int *deviceID, unsigned int bits_per_sample, unsigned long *rate, int channels); /* Note: defaults to 0 input channels - if you need input (record) use OpenEx - instead */ + if you need input (record) use OpenEx + instead */ int JACK_OpenEx(int *deviceID, unsigned int bits_per_channel, unsigned long *rate, unsigned int input_channels, unsigned int output_channels, @@ -135,7 +133,7 @@ enum JACK_PORT_CONNECTION_MODE }; /* set the mode for port connections */ -/* defaults to CONNECT_ALL */ +/* defaults to CONNECT_ALL */ void JACK_SetPortConnectionMode(enum JACK_PORT_CONNECTION_MODE mode); #ifdef __cplusplus diff --git a/src/plugins/Output/jack/jack.pro b/src/plugins/Output/jack/jack.pro index 2203db6ce..543fd0f4e 100644 --- a/src/plugins/Output/jack/jack.pro +++ b/src/plugins/Output/jack/jack.pro @@ -23,7 +23,7 @@ plugin \ link_pkgconfig TEMPLATE = lib LIBS += -lqmmp -PKGCONFIG += jack samplerate +PKGCONFIG += jack soxr RESOURCES = translations/translations.qrc |
