Merge branch 'stable-1.2' into fix/qt5-vst
# Conflicts: # .gitmodules # .travis/linux..install.sh # CMakeLists.txt # plugins/vst_base/CMakeLists.txt # src/3rdparty/CMakeLists.txt
This commit is contained in:
@@ -28,7 +28,11 @@
|
||||
#include "lmmsconfig.h"
|
||||
|
||||
#ifdef LMMS_HAVE_JACK
|
||||
#ifndef LMMS_HAVE_WEAKJACK
|
||||
#include <jack/jack.h>
|
||||
#else
|
||||
#include "AudioWeakJack.h"
|
||||
#endif
|
||||
|
||||
#include <QtCore/QVector>
|
||||
#include <QtCore/QList>
|
||||
|
||||
@@ -72,6 +72,8 @@ private:
|
||||
|
||||
struct sio_hdl *m_hdl;
|
||||
struct sio_par m_par;
|
||||
|
||||
bool m_convertEndian;
|
||||
} ;
|
||||
|
||||
|
||||
|
||||
159
include/AudioWeakJack.def
Normal file
159
include/AudioWeakJack.def
Normal file
@@ -0,0 +1,159 @@
|
||||
/* macro-absraction of the JACK API
|
||||
*
|
||||
* see weak_libjack.c for details, in general arguments are:
|
||||
*
|
||||
* [required], [return type], [name], [arguments], [code or return value]
|
||||
*
|
||||
* This file is included multiple times with different macro definitions
|
||||
* do not add header guards.
|
||||
* see https://en.wikibooks.org/wiki/C_Programming/Preprocessor#X-Macros
|
||||
*/
|
||||
|
||||
#ifdef USE_WEAK_JACK
|
||||
|
||||
/* <jack/jack.h> */
|
||||
JCFUN(1, int, client_close, 0)
|
||||
JCFUN(1, char*, get_client_name, NULL)
|
||||
JVFUN(0, on_shutdown, (jack_client_t *c, JackShutdownCallback s, void *a), (c,s,a),)
|
||||
JVFUN(0, on_info_shutdown, (jack_client_t *c, JackInfoShutdownCallback s, void *a), (c,s,a),)
|
||||
|
||||
JPFUN(1, int, set_process_callback, (jack_client_t *c, JackProcessCallback p, void *a), (c,p,a), -1)
|
||||
JPFUN(1, int, set_freewheel_callback, (jack_client_t *c, JackFreewheelCallback p, void *a), (c,p,a), -1)
|
||||
JPFUN(1, int, set_buffer_size_callback, (jack_client_t *c, JackBufferSizeCallback p, void *a), (c,p,a), -1)
|
||||
JPFUN(1, int, set_sample_rate_callback, (jack_client_t *c, JackSampleRateCallback p, void *a), (c,p,a), -1)
|
||||
JPFUN(1, int, set_port_registration_callback, (jack_client_t *c, JackPortRegistrationCallback p, void *a), (c,p,a), -1)
|
||||
JPFUN(1, int, set_port_connect_callback, (jack_client_t *c, JackPortConnectCallback p, void *a), (c,p,a), -1)
|
||||
JPFUN(1, int, set_graph_order_callback, (jack_client_t *c, JackGraphOrderCallback g, void *a), (c,g,a), -1)
|
||||
JPFUN(1, int, set_xrun_callback, (jack_client_t *c, JackXRunCallback g, void *a), (c,g,a), -1)
|
||||
JPFUN(1, int, set_latency_callback, (jack_client_t *c, JackLatencyCallback g, void *a), (c,g,a), -1)
|
||||
JVFUN(1, set_error_function, (void (*f)(const char *)), (f),)
|
||||
JVFUN(1, set_info_function, (void (*f)(const char *)), (f),)
|
||||
|
||||
JCFUN(1, int, activate, -1)
|
||||
JCFUN(1, int, deactivate, -1)
|
||||
|
||||
JPFUN(1, int, client_name_size, (), (), 32)
|
||||
|
||||
JCFUN(1, jack_nframes_t, get_sample_rate, 0)
|
||||
JCFUN(1, jack_nframes_t, get_buffer_size, 0)
|
||||
JPFUN(1, jack_nframes_t, frames_since_cycle_start, (const jack_client_t *c), (c), 0)
|
||||
JPFUN(1, jack_nframes_t, frame_time, (const jack_client_t *c), (c), 0)
|
||||
JPFUN(1, jack_nframes_t, last_frame_time, (const jack_client_t *c), (c), 0)
|
||||
JPFUN(1, jack_time_t, get_time, (void), (), 0)
|
||||
JCFUN(1, float, cpu_load, 0)
|
||||
JCFUN(1, int, is_realtime, 0)
|
||||
|
||||
JPFUN(1, int, set_freewheel, (jack_client_t *c, int o), (c,o), 0)
|
||||
JPFUN(1, int, set_buffer_size, (jack_client_t *c, jack_nframes_t b), (c,b), 0)
|
||||
|
||||
JCFUN(0, int, recompute_total_latencies, 0)
|
||||
JPFUN(0, jack_nframes_t, port_get_total_latency, (jack_client_t *c, jack_port_t *p), (c,p), 0)
|
||||
JVFUN(0, port_get_latency_range, (jack_port_t *p, jack_latency_callback_mode_t m, jack_latency_range_t *r), (p,m,r), if (r) {r->min = r->max = 0;})
|
||||
JVFUN(0, port_set_latency_range, (jack_port_t *p, jack_latency_callback_mode_t m, jack_latency_range_t *r), (p,m,r),)
|
||||
|
||||
JPFUN(1, void*, port_get_buffer, (jack_port_t *p, jack_nframes_t n), (p,n), NULL)
|
||||
JPFUN(1, int, port_request_monitor, (jack_port_t *p, int o), (p,o), 0)
|
||||
JPFUN(1, int, port_ensure_monitor, (jack_port_t *p, int o), (p,o), 0)
|
||||
JPFUN(1, int, port_monitoring_input, (jack_port_t *p), (p), 0)
|
||||
|
||||
JPFUN(1, const char*, port_name, (const jack_port_t *p), (p), NULL)
|
||||
JPFUN(1, const char*, port_short_name, (const jack_port_t *p), (p), NULL)
|
||||
JPFUN(1, int, port_flags, (const jack_port_t *p), (p), 0)
|
||||
JPFUN(1, const char**, get_ports,(jack_client_t *c, const char *p, const char *t, unsigned long f), (c,p,t,f), NULL)
|
||||
JPFUN(1, int, port_name_size, (void), (), 0)
|
||||
JPFUN(1, int, port_type_size, (void), (), 0)
|
||||
JPFUN(1, size_t, port_type_get_buffer_size, (jack_client_t *c, const char *t), (c,t), 0)
|
||||
JPFUN(1, jack_port_t*, port_by_name, (jack_client_t *c, const char *n), (c,n), NULL)
|
||||
JPFUN(1, jack_port_t*, port_by_id, (jack_client_t *c, jack_port_id_t i), (c,i), NULL)
|
||||
JPFUN(1, jack_port_t*, port_register, (jack_client_t *c, const char *n, const char *t, unsigned long f, unsigned long b), (c,n,t,f,b), NULL)
|
||||
JPFUN(1, int, port_unregister, (jack_client_t *c, jack_port_t *p), (c,p), 0)
|
||||
JPFUN(1, const char *, port_type, (const jack_port_t *p), (p), 0)
|
||||
JPFUN(1, const char **, port_get_connections, (const jack_port_t *p), (p), 0)
|
||||
JPFUN(1, const char **, port_get_all_connections, (const jack_client_t *c, const jack_port_t *p), (c,p), 0)
|
||||
JPFUN(1, int, port_set_name, (jack_port_t *p, const char *n), (p,n), -1)
|
||||
JXFUN(0, int, port_rename, (jack_client_t *c, jack_port_t *p, const char *n), (c,p,n), return jack_port_set_name (p,n);)
|
||||
JPFUN(1, int, port_get_aliases, (const jack_port_t *port, char* const aliases[2]), (port,aliases), 0)
|
||||
JPFUN(1, int, port_disconnect, (jack_client_t *c, jack_port_t *p), (c,p), 0)
|
||||
JPFUN(1, int, connect, (jack_client_t *c, const char *s, const char *d), (c,s,d), -1)
|
||||
JPFUN(1, int, disconnect, (jack_client_t *c, const char *s, const char *d), (c,s,d), -1)
|
||||
JVFUN(0, free, (void *p), (p), free(p);)
|
||||
|
||||
JCFUN(1, jack_nframes_t, cycle_wait, 0)
|
||||
JVFUN(1, cycle_signal, (jack_client_t *c, int s), (c,s),)
|
||||
JPFUN(1, int, set_process_thread, (jack_client_t *c, JackThreadCallback p, void *a), (c,p,a), -1)
|
||||
JPFUN(1, int, set_thread_init_callback, (jack_client_t *c, JackThreadInitCallback p, void *a), (c,p,a), -1)
|
||||
|
||||
JPFUN(1, int, transport_locate, (jack_client_t *c, jack_nframes_t f), (c,f), 0)
|
||||
JVFUN(1, transport_start, (jack_client_t *c), (c),)
|
||||
JVFUN(1, transport_stop, (jack_client_t *c), (c),)
|
||||
JPFUN(1, jack_nframes_t, get_current_transport_frame, (const jack_client_t *c), (c), 0)
|
||||
JXFUN(1, jack_transport_state_t, transport_query, (const jack_client_t *c, jack_position_t *p), (c,p), memset(p, 0, sizeof(jack_position_t)); return JackTransportStopped;)
|
||||
JPFUN(1, int, set_sync_callback, (jack_client_t *c, JackSyncCallback p, void *a), (c,p,a), -1)
|
||||
JPFUN(1, int, set_timebase_callback, (jack_client_t *c, int l, JackTimebaseCallback p, void *a), (c,l,p,a), -1)
|
||||
JCFUN(1, int, release_timebase, 0)
|
||||
|
||||
/* <jack/midiport.h> */
|
||||
JPFUN(1, uint32_t, midi_get_event_count, (void* p), (p), 0)
|
||||
JPFUN(1, int, midi_event_get, (jack_midi_event_t *e, void *p, uint32_t i), (e,p,i), -1)
|
||||
JPFUN(1, int, midi_event_write, (void *b, jack_nframes_t t, const jack_midi_data_t *d, size_t s), (b,t,d,s), -1)
|
||||
JVFUN(1, midi_clear_buffer, (void *b), (b),)
|
||||
|
||||
/* <jack/session.h> */
|
||||
JPFUN(0, int, set_session_callback, (jack_client_t *c, JackSessionCallback s, void *a), (c,s,a), -1)
|
||||
JPFUN(0, int, session_reply, (jack_client_t *c, jack_session_event_t *e), (c,e), -1)
|
||||
JVFUN(0, session_event_free, (jack_session_event_t *e), (e), )
|
||||
|
||||
/* <jack/ringbuffer.h> */
|
||||
JPFUN(1, jack_ringbuffer_t *, ringbuffer_create, (size_t s), (s), NULL)
|
||||
JVFUN(1, ringbuffer_free, (jack_ringbuffer_t *rb), (rb), )
|
||||
JVFUN(1, ringbuffer_reset, (jack_ringbuffer_t *rb), (rb), )
|
||||
JVFUN(1, ringbuffer_read_advance, (jack_ringbuffer_t *rb, size_t c), (rb,c), )
|
||||
JVFUN(1, ringbuffer_write_advance, (jack_ringbuffer_t *rb, size_t c), (rb,c), )
|
||||
JPFUN(1, size_t, ringbuffer_read_space, (const jack_ringbuffer_t *rb), (rb), 0)
|
||||
JPFUN(1, size_t, ringbuffer_write_space, (const jack_ringbuffer_t *rb), (rb), 0)
|
||||
JPFUN(1, size_t, ringbuffer_read, (jack_ringbuffer_t *rb, char *d, size_t c), (rb,d,c), 0)
|
||||
JPFUN(1, size_t, ringbuffer_write, (jack_ringbuffer_t *rb, const char *s, size_t c), (rb,s,c), 0)
|
||||
JPFUN(0, int, ringbuffer_mlock, (jack_ringbuffer_t *rb), (rb), 0)
|
||||
JVFUN(0, ringbuffer_get_read_vector, (const jack_ringbuffer_t *rb, jack_ringbuffer_data_t *v), (rb,v), if (v) {v->buf=NULL; v->len=0;} )
|
||||
JVFUN(0, ringbuffer_get_write_vector, (const jack_ringbuffer_t *rb, jack_ringbuffer_data_t *v), (rb,v), if (v) {v->buf=NULL; v->len=0;} )
|
||||
JPFUN(0, size_t, ringbuffer_peek, (jack_ringbuffer_t *rb, char *d, size_t c), (rb,d,c), 0)
|
||||
|
||||
/* <jack/thread.h> */
|
||||
JCFUN(0, int, client_real_time_priority, 0)
|
||||
JCFUN(0, int, client_max_real_time_priority, 0)
|
||||
JPFUN(0, int, acquire_real_time_scheduling, (jack_native_thread_t t, int p), (t,p), 0)
|
||||
JPFUN(0, int, drop_real_time_scheduling, (jack_native_thread_t t), (t), 0)
|
||||
JPFUN(0, int, client_stop_thread, (jack_client_t* c, jack_native_thread_t t), (c,t), 0)
|
||||
JPFUN(0, int, client_kill_thread, (jack_client_t* c, jack_native_thread_t t), (c,t), 0)
|
||||
#ifndef _WIN32
|
||||
JVFUN(0, set_thread_creator, (jack_thread_creator_t c), (c),)
|
||||
#endif
|
||||
JPFUN(1, int, client_create_thread, \
|
||||
(jack_client_t* c, jack_native_thread_t *t, int p, int r, void *(*f)(void*), void *a), (c,t,p,r,f,a), 0)
|
||||
|
||||
#ifndef NO_JACK_METADATA
|
||||
/* <jack/uuid.h> - TODO*/
|
||||
|
||||
/* <jack/jack.h> */
|
||||
JPFUN(0, char *, get_uuid_for_client_name, (jack_client_t* c, const char* n), (c,n), NULL)
|
||||
JPFUN(0, char *, get_client_name_by_uuid, (jack_client_t* c, const char* u), (c,u), NULL)
|
||||
JPFUN(0, jack_uuid_t, port_uuid, (const jack_port_t *p), (p), 0)
|
||||
|
||||
/* <jack/metadata.h> */
|
||||
JPFUN(0, int, set_property, (jack_client_t* c, jack_uuid_t s, const char* k, const char* v, const char* t), (c,s,k,v,t), -1)
|
||||
JXFUN(0, int, get_property, (jack_uuid_t s, const char* k, char** v, char** t), (s,k,v,t), if (v) *v=NULL; if (t) *t=NULL; return -1;)
|
||||
JVFUN(0, free_description, (jack_description_t* d, int f), (d,f),)
|
||||
JXFUN(0, int, get_properties, (jack_uuid_t s, jack_description_t* d), (s,d), if (d) {d->properties = NULL; d->property_cnt = 0;} return -1;)
|
||||
JXFUN(0, int, get_all_properties, (jack_description_t** d), (d), if (d) *d=NULL; return -1;)
|
||||
JPFUN(0, int, remove_property, (jack_client_t* c, jack_uuid_t s, const char* k), (c,s,k), -1)
|
||||
JPFUN(0, int, remove_properties, (jack_client_t* c, jack_uuid_t s), (c,s), -1)
|
||||
JPFUN(0, int, remove_all_properties, (jack_client_t* c), (c), -1)
|
||||
JPFUN(0, int, set_property_change_callback, (jack_client_t *c, JackPropertyChangeCallback s, void *a), (c,s,a), -1)
|
||||
#endif
|
||||
|
||||
/* <jack/statistics.h> */
|
||||
JCFUN(1, float, get_max_delayed_usecs, 0.0)
|
||||
JCFUN(1, float, get_xrun_delayed_usecs, 0.0)
|
||||
JVFUN(0, reset_max_delayed_usecs, (jack_client_t *c), (c),)
|
||||
|
||||
#endif // end USE_WEAK_JACK
|
||||
237
include/AudioWeakJack.h
Normal file
237
include/AudioWeakJack.h
Normal file
@@ -0,0 +1,237 @@
|
||||
/* runtime/weak dynamic JACK linking
|
||||
*
|
||||
* (C) 2014 Robin Gareus <robin@gareus.org>
|
||||
*
|
||||
* The wrapped jack API itself is
|
||||
* (C) 2001 Paul Davis
|
||||
* (C) 2004 Jack O'Quin
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
#ifndef _WEAK_JACK_H
|
||||
#define _WEAK_JACK_H
|
||||
|
||||
// LMMS uses LMMS_HAVE_WEAKJACK instead
|
||||
#ifndef USE_WEAK_JACK
|
||||
#define USE_WEAK_JACK
|
||||
#endif
|
||||
|
||||
// LMMS doesn't use metadata.h
|
||||
#ifndef NO_JACK_METADATA
|
||||
#define NO_JACK_METADATA
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
{
|
||||
#endif
|
||||
|
||||
/** check if libjack is available
|
||||
*
|
||||
* return 0 if libjack is dynamically linked of was
|
||||
* successfully dl-opened. Otherwise:
|
||||
*
|
||||
* -1: library was not initialized
|
||||
* -2: libjack was not found
|
||||
* > 0 bitwise flags:
|
||||
* 1: a required function was not found in libjack
|
||||
* 2: jack_client_open was not found in libjack
|
||||
*/
|
||||
int have_libjack(void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef USE_WEAK_JACK
|
||||
|
||||
/* <jack/jack.h> */
|
||||
#define jack_client_close WJACK_client_close
|
||||
#define jack_get_client_name WJACK_get_client_name
|
||||
#define jack_get_sample_rate WJACK_get_sample_rate
|
||||
#define jack_get_buffer_size WJACK_get_buffer_size
|
||||
#define jack_frames_since_cycle_start WJACK_frames_since_cycle_start
|
||||
#define jack_frame_time WJACK_frame_time
|
||||
#define jack_last_frame_time WJACK_last_frame_time
|
||||
#define jack_get_time WJACK_get_time
|
||||
#define jack_cpu_load WJACK_cpu_load
|
||||
#define jack_is_realtime WJACK_is_realtime
|
||||
|
||||
#define jack_client_name_size WJACK_client_name_size
|
||||
|
||||
#define jack_set_freewheel WJACK_set_freewheel
|
||||
#define jack_set_buffer_size WJACK_set_buffer_size
|
||||
|
||||
#define jack_on_shutdown WJACK_on_shutdown
|
||||
#define jack_on_info_shutdown WJACK_on_info_shutdown
|
||||
#define jack_set_process_callback WJACK_set_process_callback
|
||||
#define jack_set_freewheel_callback WJACK_set_freewheel_callback
|
||||
#define jack_set_buffer_size_callback WJACK_set_buffer_size_callback
|
||||
#define jack_set_sample_rate_callback WJACK_set_sample_rate_callback
|
||||
#define jack_set_port_registration_callback WJACK_set_port_registration_callback
|
||||
#define jack_set_port_connect_callback WJACK_set_port_connect_callback
|
||||
#define jack_set_graph_order_callback WJACK_set_graph_order_callback
|
||||
#define jack_set_xrun_callback WJACK_set_xrun_callback
|
||||
#define jack_set_latency_callback WJACK_set_latency_callback
|
||||
#define jack_set_error_function WJACK_set_error_function
|
||||
#define jack_set_info_function WJACK_set_info_function
|
||||
|
||||
#define jack_activate WJACK_activate
|
||||
#define jack_deactivate WJACK_deactivate
|
||||
|
||||
#define jack_recompute_total_latencies WJACK_recompute_total_latencies
|
||||
#define jack_port_get_total_latency WJACK_port_get_total_latency
|
||||
#define jack_port_get_latency_range WJACK_port_get_latency_range
|
||||
#define jack_port_set_latency_range WJACK_port_set_latency_range
|
||||
#define jack_port_get_buffer WJACK_port_get_buffer
|
||||
#define jack_port_request_monitor WJACK_port_request_monitor
|
||||
#define jack_port_ensure_monitor WJACK_port_ensure_monitor
|
||||
#define jack_port_monitoring_input WJACK_port_monitoring_input
|
||||
|
||||
#define jack_port_name WJACK_port_name
|
||||
#define jack_port_short_name WJACK_port_short_name
|
||||
#define jack_port_flags WJACK_port_flags
|
||||
#define jack_get_ports WJACK_get_ports
|
||||
#define jack_port_name_size WJACK_port_name_size
|
||||
#define jack_port_type_size WJACK_port_type_size
|
||||
#define jack_port_type_get_buffer_size WJACK_port_type_get_buffer_size
|
||||
#define jack_port_by_name WJACK_port_by_name
|
||||
#define jack_port_by_id WJACK_port_by_id
|
||||
#define jack_port_set_name WJACK_port_set_name
|
||||
#define jack_port_get_aliases WJACK_port_get_aliases
|
||||
#define jack_port_rename WJACK_port_rename
|
||||
#define jack_port_disconnect WJACK_port_disconnect
|
||||
#define jack_port_register WJACK_port_register
|
||||
#define jack_port_unregister WJACK_port_unregister
|
||||
#define jack_port_type WJACK_port_type
|
||||
#define jack_port_get_connections WJACK_port_get_connections
|
||||
#define jack_port_get_all_connections WJACK_port_get_all_connections
|
||||
#define jack_connect WJACK_connect
|
||||
#define jack_disconnect WJACK_disconnect
|
||||
#define jack_free WJACK_free
|
||||
|
||||
#define jack_cycle_wait WJACK_cycle_wait
|
||||
#define jack_cycle_signal WJACK_cycle_signal
|
||||
#define jack_set_process_thread WJACK_set_process_thread
|
||||
#define jack_set_thread_init_callback WJACK_set_thread_init_callback
|
||||
|
||||
/* <jack/transport.h> */
|
||||
#define jack_get_current_transport_frame WJACK_get_current_transport_frame
|
||||
#define jack_transport_locate WJACK_transport_locate
|
||||
#define jack_transport_start WJACK_transport_start
|
||||
#define jack_transport_stop WJACK_transport_stop
|
||||
#define jack_transport_query WJACK_transport_query
|
||||
#define jack_set_sync_callback WJACK_set_sync_callback
|
||||
#define jack_set_timebase_callback WJACK_set_timebase_callback
|
||||
#define jack_release_timebase WJACK_release_timebase
|
||||
|
||||
/* <jack/midiport.h> */
|
||||
#define jack_midi_get_event_count WJACK_midi_get_event_count
|
||||
#define jack_midi_event_get WJACK_midi_event_get
|
||||
#define jack_midi_event_write WJACK_midi_event_write
|
||||
#define jack_midi_clear_buffer WJACK_midi_clear_buffer
|
||||
|
||||
/* <jack/session.h> */
|
||||
#define jack_set_session_callback WJACK_set_session_callback
|
||||
#define jack_session_reply WJACK_session_reply
|
||||
#define jack_session_event_free WJACK_session_event_free
|
||||
|
||||
/* <jack/ringbuffer.h> */
|
||||
#define jack_ringbuffer_create WJACK_ringbuffer_create
|
||||
#define jack_ringbuffer_free WJACK_ringbuffer_free
|
||||
#define jack_ringbuffer_reset WJACK_ringbuffer_reset
|
||||
#define jack_ringbuffer_read_advance WJACK_ringbuffer_read_advance
|
||||
#define jack_ringbuffer_write_advance WJACK_ringbuffer_write_advance
|
||||
#define jack_ringbuffer_read_space WJACK_ringbuffer_read_space
|
||||
#define jack_ringbuffer_write_space WJACK_ringbuffer_write_space
|
||||
#define jack_ringbuffer_read WJACK_ringbuffer_read
|
||||
#define jack_ringbuffer_write WJACK_ringbuffer_write
|
||||
#define jack_ringbuffer_mlock WJACK_ringbuffer_mlock
|
||||
#define jack_ringbuffer_get_read_vector WJACK_ringbuffer_get_read_vector
|
||||
#define jack_ringbuffer_get_write_vector WJACK_ringbuffer_get_write_vector
|
||||
#define jack_ringbuffer_peek WJACK_ringbuffer_peek
|
||||
|
||||
/* <jack/thread.h> */
|
||||
#define jack_client_real_time_priority WJACK_client_real_time_priority
|
||||
#define jack_client_max_real_time_priority WJACK_client_max_real_time_priority
|
||||
#define jack_acquire_real_time_scheduling WJACK_acquire_real_time_scheduling
|
||||
#define jack_client_create_thread WJACK_client_create_thread
|
||||
#define jack_drop_real_time_scheduling WJACK_drop_real_time_scheduling
|
||||
#define jack_client_stop_thread WJACK_client_stop_thread
|
||||
#define jack_client_kill_thread WJACK_client_kill_thread
|
||||
#define jack_set_thread_creator WJACK_set_thread_creator
|
||||
|
||||
#define jack_client_open WJACK_client_client_openXXX
|
||||
|
||||
#ifndef NO_JACK_METADATA
|
||||
/* <jack/metadata.h> */
|
||||
#define jack_get_uuid_for_client_name WJACK_get_uuid_for_client_name
|
||||
#define jack_get_client_name_by_uuid WJACK_get_client_name_by_uuid
|
||||
#define jack_port_uuid WJACK_port_uuid
|
||||
|
||||
#define jack_set_property WJACK_set_property
|
||||
#define jack_get_property WJACK_get_property
|
||||
#define jack_free_description WJACK_free_description
|
||||
#define jack_get_properties WJACK_get_properties
|
||||
#define jack_get_all_properties WJACK_get_all_properties
|
||||
#define jack_remove_property WJACK_remove_property
|
||||
#define jack_remove_properties WJACK_remove_properties
|
||||
#define jack_remove_all_properties WJACK_remove_all_properties
|
||||
#define jack_set_property_change_callback WJACK_set_property_change_callback
|
||||
#endif
|
||||
|
||||
/* <jack/statistics.h> */
|
||||
#define jack_get_max_delayed_usecs WJACK_get_max_delayed_usecs
|
||||
#define jack_get_xrun_delayed_usecs WJACK_get_xrun_delayed_usecs
|
||||
#define jack_reset_max_delayed_usecs WJACK_reset_max_delayed_usecs
|
||||
|
||||
#endif // end USE_WEAK_JACK
|
||||
|
||||
#include <jack/jack.h>
|
||||
#include <jack/transport.h>
|
||||
#include <jack/ringbuffer.h>
|
||||
#include <jack/midiport.h>
|
||||
#include <jack/session.h>
|
||||
#include <jack/thread.h>
|
||||
|
||||
#ifndef NO_JACK_METADATA
|
||||
#include <jack/metadata.h>
|
||||
#endif
|
||||
|
||||
#ifdef USE_WEAK_JACK
|
||||
|
||||
#undef jack_client_open
|
||||
|
||||
/* var-args hack */
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
void (* WJACK_get_client_open (void)) (void);
|
||||
jack_client_t * WJACK_no_client_open (const char *client_name, jack_options_t options, jack_status_t *status, ...);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#define jack_client_open(...) \
|
||||
( \
|
||||
(WJACK_get_client_open() != NULL) \
|
||||
? ((jack_client_t* (*)(const char *, jack_options_t, jack_status_t *, ...))(WJACK_get_client_open()))(__VA_ARGS__) \
|
||||
: WJACK_no_client_open(__VA_ARGS__) \
|
||||
)
|
||||
|
||||
#endif // end USE_WEAK_JACK
|
||||
|
||||
#endif // _WEAK_JACK_H
|
||||
@@ -25,6 +25,7 @@
|
||||
#ifndef AUTOMATABLE_MODEL_H
|
||||
#define AUTOMATABLE_MODEL_H
|
||||
|
||||
#include <QtCore/QMap>
|
||||
#include <QtCore/QMutex>
|
||||
|
||||
#include "JournallingObject.h"
|
||||
|
||||
@@ -132,6 +132,7 @@ protected:
|
||||
void getSelectedValues(timeMap & selected_values );
|
||||
|
||||
void drawLine( int x0, float y0, int x1, float y1 );
|
||||
void removePoints( int x0, int x1 );
|
||||
|
||||
protected slots:
|
||||
void play();
|
||||
|
||||
@@ -30,9 +30,6 @@
|
||||
#include "export.h"
|
||||
#include "lmms_basics.h"
|
||||
|
||||
const int BM_INITIAL_BUFFERS = 512;
|
||||
//const int BM_INCREMENT = 64;
|
||||
|
||||
class EXPORT BufferManager
|
||||
{
|
||||
public:
|
||||
@@ -46,17 +43,6 @@ public:
|
||||
const f_cnt_t offset = 0 );
|
||||
#endif
|
||||
static void release( sampleFrame * buf );
|
||||
static void refresh();
|
||||
// static void extend( int c );
|
||||
|
||||
private:
|
||||
static sampleFrame ** s_available;
|
||||
static AtomicInt s_availableIndex;
|
||||
|
||||
static sampleFrame ** s_released;
|
||||
static AtomicInt s_releasedIndex;
|
||||
// static QReadWriteLock s_mutex;
|
||||
static int s_size;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -25,13 +25,22 @@
|
||||
#ifndef MAINAPPLICATION_H
|
||||
#define MAINAPPLICATION_H
|
||||
|
||||
#include "lmmsconfig.h"
|
||||
|
||||
#include <QApplication>
|
||||
|
||||
#ifdef LMMS_BUILD_WIN32
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
||||
class MainApplication : public QApplication
|
||||
{
|
||||
public:
|
||||
MainApplication(int& argc, char** argv);
|
||||
bool event(QEvent* event);
|
||||
#ifdef LMMS_BUILD_WIN32
|
||||
bool winEventFilter(MSG* msg, long* result);
|
||||
#endif
|
||||
inline QString& queuedFile()
|
||||
{
|
||||
return m_queuedFile;
|
||||
|
||||
@@ -249,11 +249,4 @@ signals:
|
||||
|
||||
} ;
|
||||
|
||||
class AutoSaveThread : public QThread
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
void run();
|
||||
} ;
|
||||
|
||||
#endif
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
class MemoryHelper {
|
||||
public:
|
||||
|
||||
static void* alignedMalloc( int );
|
||||
static void* alignedMalloc( size_t );
|
||||
|
||||
static void alignedFree( void* );
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
/*
|
||||
* MemoryManager.h - A lightweight, generic memory manager for LMMS
|
||||
* MemoryManager.h
|
||||
*
|
||||
* Copyright (c) 2017 Lukas W <lukaswhl/at/gmail.com>
|
||||
* Copyright (c) 2014 Vesa Kivimäki
|
||||
* Copyright (c) 2007-2014 Tobias Doerffel <tobydox/at/users.sourceforge.net>
|
||||
*
|
||||
@@ -26,81 +27,41 @@
|
||||
#ifndef MEMORY_MANAGER_H
|
||||
#define MEMORY_MANAGER_H
|
||||
|
||||
#include <QtCore/QVector>
|
||||
#include <QtCore/QMutex>
|
||||
#include <QtCore/QHash>
|
||||
#include "MemoryHelper.h"
|
||||
#include <cstddef>
|
||||
#include <vector>
|
||||
|
||||
#include "export.h"
|
||||
|
||||
class QReadWriteLock;
|
||||
|
||||
const int MM_CHUNK_SIZE = 64; // granularity of managed memory
|
||||
const int MM_INITIAL_CHUNKS = 1024 * 1024; // how many chunks to allocate at startup - TODO: make configurable
|
||||
const int MM_INCREMENT_CHUNKS = 16 * 1024; // min. amount of chunks to increment at a time
|
||||
|
||||
struct MemoryPool
|
||||
{
|
||||
void * m_pool;
|
||||
char * m_free;
|
||||
int m_chunks;
|
||||
QMutex m_mutex;
|
||||
|
||||
MemoryPool() :
|
||||
m_pool( NULL ),
|
||||
m_free( NULL ),
|
||||
m_chunks( 0 )
|
||||
{}
|
||||
|
||||
MemoryPool( int chunks ) :
|
||||
m_chunks( chunks )
|
||||
{
|
||||
m_free = (char*) MemoryHelper::alignedMalloc( chunks );
|
||||
memset( m_free, 1, chunks );
|
||||
}
|
||||
|
||||
MemoryPool( const MemoryPool & mp ) :
|
||||
m_pool( mp.m_pool ),
|
||||
m_free( mp.m_free ),
|
||||
m_chunks( mp.m_chunks ),
|
||||
m_mutex()
|
||||
{}
|
||||
|
||||
MemoryPool & operator = ( const MemoryPool & mp )
|
||||
{
|
||||
m_pool = mp.m_pool;
|
||||
m_free = mp.m_free;
|
||||
m_chunks = mp.m_chunks;
|
||||
return *this;
|
||||
}
|
||||
|
||||
void * getChunks( int chunksNeeded );
|
||||
void releaseChunks( void * ptr, int chunks );
|
||||
};
|
||||
|
||||
struct PtrInfo
|
||||
{
|
||||
int chunks;
|
||||
MemoryPool * memPool;
|
||||
};
|
||||
|
||||
typedef QVector<MemoryPool> MemoryPoolVector;
|
||||
typedef QHash<void*, PtrInfo> PointerInfoMap;
|
||||
|
||||
class EXPORT MemoryManager
|
||||
{
|
||||
public:
|
||||
static bool init();
|
||||
struct ThreadGuard
|
||||
{
|
||||
ThreadGuard();
|
||||
~ThreadGuard();
|
||||
};
|
||||
|
||||
static void * alloc( size_t size );
|
||||
static void free( void * ptr );
|
||||
static int extend( int chunks ); // returns index of created pool (for use by alloc)
|
||||
static void cleanup();
|
||||
};
|
||||
|
||||
private:
|
||||
static MemoryPoolVector s_memoryPools;
|
||||
static QReadWriteLock s_poolMutex;
|
||||
template<typename T>
|
||||
struct MmAllocator
|
||||
{
|
||||
typedef T value_type;
|
||||
template<class U> struct rebind { typedef MmAllocator<U> other; };
|
||||
|
||||
static PointerInfoMap s_pointerInfo;
|
||||
static QMutex s_pointerMutex;
|
||||
T* allocate( std::size_t n )
|
||||
{
|
||||
return reinterpret_cast<T*>( MemoryManager::alloc( sizeof(T) * n ) );
|
||||
}
|
||||
|
||||
void deallocate( T* p, std::size_t )
|
||||
{
|
||||
MemoryManager::free( p );
|
||||
}
|
||||
|
||||
typedef std::vector<T, MmAllocator<T> > vector;
|
||||
};
|
||||
|
||||
|
||||
@@ -124,36 +85,8 @@ static void operator delete[] ( void * ptr ) \
|
||||
}
|
||||
|
||||
// for use in cases where overriding new/delete isn't a possibility
|
||||
#define MM_ALLOC( type, count ) (type*) MemoryManager::alloc( sizeof( type ) * count )
|
||||
#define MM_ALLOC( type, count ) reinterpret_cast<type*>( MemoryManager::alloc( sizeof( type ) * count ) )
|
||||
// and just for symmetry...
|
||||
#define MM_FREE( ptr ) MemoryManager::free( ptr )
|
||||
|
||||
|
||||
|
||||
// for debugging purposes
|
||||
|
||||
#define MM_OPERATORS_DEBUG \
|
||||
public: \
|
||||
static void * operator new ( size_t size ) \
|
||||
{ \
|
||||
qDebug( "MM_OPERATORS_DEBUG: new called for %d bytes", size ); \
|
||||
return MemoryManager::alloc( size ); \
|
||||
} \
|
||||
static void * operator new[] ( size_t size ) \
|
||||
{ \
|
||||
qDebug( "MM_OPERATORS_DEBUG: new[] called for %d bytes", size ); \
|
||||
return MemoryManager::alloc( size ); \
|
||||
} \
|
||||
static void operator delete ( void * ptr ) \
|
||||
{ \
|
||||
qDebug( "MM_OPERATORS_DEBUG: delete called for %p", ptr ); \
|
||||
MemoryManager::free( ptr ); \
|
||||
} \
|
||||
static void operator delete[] ( void * ptr ) \
|
||||
{ \
|
||||
qDebug( "MM_OPERATORS_DEBUG: delete[] called for %p", ptr ); \
|
||||
MemoryManager::free( ptr ); \
|
||||
}
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
@@ -28,8 +28,12 @@
|
||||
#include "lmmsconfig.h"
|
||||
|
||||
#ifdef LMMS_HAVE_JACK
|
||||
#ifndef LMMS_HAVE_WEAKJACK
|
||||
#include <jack/jack.h>
|
||||
#include <jack/midiport.h>
|
||||
#else
|
||||
#include "AudioWeakJack.h"
|
||||
#endif
|
||||
|
||||
#include <QtCore/QThread>
|
||||
#include <QMutex>
|
||||
|
||||
@@ -113,11 +113,19 @@ public:
|
||||
void quantizeLength( const int qGrid );
|
||||
void quantizePos( const int qGrid );
|
||||
|
||||
static inline bool lessThan( Note * &lhs, Note * &rhs )
|
||||
static inline bool lessThan( const Note * lhs, const Note * rhs )
|
||||
{
|
||||
// function to compare two notes - must be called explictly when
|
||||
// using qSort
|
||||
return (bool) ((int) ( *lhs ).pos() < (int) ( *rhs ).pos());
|
||||
if( (int)( *lhs ).pos() < (int)( *rhs ).pos() )
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else if( (int)( *lhs ).pos() > (int)( *rhs ).pos() )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return ( (int)( *lhs ).key() > (int)( *rhs ).key() );
|
||||
}
|
||||
|
||||
inline bool selected() const
|
||||
|
||||
@@ -66,8 +66,7 @@ public:
|
||||
NotePlayHandle* parent = NULL,
|
||||
int midiEventChannel = -1,
|
||||
Origin origin = OriginPattern );
|
||||
virtual ~NotePlayHandle() {}
|
||||
void done();
|
||||
virtual ~NotePlayHandle();
|
||||
|
||||
void * operator new ( size_t size, void * p )
|
||||
{
|
||||
|
||||
@@ -28,6 +28,8 @@
|
||||
#include <QtCore/QList>
|
||||
#include <QtCore/QMutex>
|
||||
|
||||
#include "MemoryManager.h"
|
||||
|
||||
#include "ThreadableJob.h"
|
||||
#include "lmms_basics.h"
|
||||
|
||||
@@ -142,20 +144,17 @@ public:
|
||||
|
||||
void releaseBuffer();
|
||||
|
||||
sampleFrame * buffer()
|
||||
{
|
||||
return m_playHandleBuffer;
|
||||
}
|
||||
sampleFrame * buffer();
|
||||
|
||||
private:
|
||||
Type m_type;
|
||||
f_cnt_t m_offset;
|
||||
QThread* m_affinity;
|
||||
QMutex m_processingLock;
|
||||
sampleFrame * m_playHandleBuffer;
|
||||
sampleFrame* m_playHandleBuffer;
|
||||
bool m_bufferReleased;
|
||||
bool m_usesBuffer;
|
||||
AudioPort * m_audioPort;
|
||||
|
||||
} ;
|
||||
|
||||
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
#include <memory>
|
||||
|
||||
#include <QtCore/QFileInfo>
|
||||
#include <QtCore/QHash>
|
||||
#include <QtCore/QList>
|
||||
|
||||
#include "export.h"
|
||||
|
||||
@@ -624,6 +624,11 @@ public:
|
||||
fetchAndProcessNextMessage();
|
||||
}
|
||||
}
|
||||
|
||||
static bool isMainThreadWaiting()
|
||||
{
|
||||
return waitDepthCounter() > 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
virtual bool processMessage( const message & _m ) = 0;
|
||||
@@ -660,6 +665,14 @@ protected:
|
||||
|
||||
|
||||
private:
|
||||
#ifndef BUILD_REMOTE_PLUGIN_CLIENT
|
||||
static int & waitDepthCounter()
|
||||
{
|
||||
static int waitDepth = 0;
|
||||
return waitDepth;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef SYNC_WITH_SHM_FIFO
|
||||
shmFifo * m_in;
|
||||
shmFifo * m_out;
|
||||
@@ -1104,6 +1117,26 @@ RemotePluginBase::message RemotePluginBase::waitForMessage(
|
||||
_busy_waiting = QThread::currentThread() ==
|
||||
QCoreApplication::instance()->thread();
|
||||
}
|
||||
|
||||
struct WaitDepthCounter
|
||||
{
|
||||
WaitDepthCounter( int & depth, bool busy ) :
|
||||
m_depth( depth ),
|
||||
m_busy( busy )
|
||||
{
|
||||
if( m_busy ) { ++m_depth; }
|
||||
}
|
||||
|
||||
~WaitDepthCounter()
|
||||
{
|
||||
if( m_busy ) { --m_depth; }
|
||||
}
|
||||
|
||||
int & m_depth;
|
||||
bool m_busy;
|
||||
};
|
||||
|
||||
WaitDepthCounter wdc( waitDepthCounter(), _busy_waiting );
|
||||
#endif
|
||||
while( !isInvalid() )
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user