#include "pbd/error.h"
-#include "jack/jack.h"
-#include "jack/thread.h"
-
#include "ardour/audioengine.h"
#include "ardour/session.h"
#include "ardour/types.h"
#define GET_PRIVATE_JACK_POINTER(localvar) jack_client_t* localvar = _jack_connection->jack(); if (!(localvar)) { return; }
#define GET_PRIVATE_JACK_POINTER_RET(localvar,r) jack_client_t* localvar = _jack_connection->jack(); if (!(localvar)) { return r; }
-JACKAudioBackend::JACKAudioBackend (AudioEngine& e, boost::shared_ptr<JackConnection> jc)
- : AudioBackend (e)
+JACKAudioBackend::JACKAudioBackend (AudioEngine& e, AudioBackendInfo& info, boost::shared_ptr<JackConnection> jc)
+ : AudioBackend (e, info)
, _jack_connection (jc)
, _running (false)
, _freewheeling (false)
, _target_sample_rate (48000)
, _target_buffer_size (1024)
- , _target_sample_format (FormatFloat)
, _target_interleaved (false)
, _target_input_channels (0)
, _target_output_channels (0)
return jack_set_buffer_size (_priv_jack, nframes);
}
-int
-JACKAudioBackend::set_sample_format (SampleFormat sf)
-{
- /* as far as JACK clients are concerned, the hardware is always
- * floating point format.
- */
- if (sf == FormatFloat) {
- return 0;
- }
- return -1;
-}
-
int
JACKAudioBackend::set_interleaved (bool yn)
{
return _target_buffer_size;
}
-SampleFormat
-JACKAudioBackend::sample_format () const
-{
- return FormatFloat;
-}
-
bool
JACKAudioBackend::interleaved () const
{
int
JACKAudioBackend::stop ()
{
+ _running = false; // no 'engine halted message'.
GET_PRIVATE_JACK_POINTER_RET (_priv_jack, -1);
_jack_connection->close ();
JACKAudioBackend::jack_sync_callback (jack_transport_state_t state, jack_position_t* pos)
{
TransportState tstate;
+ bool tstate_valid = true;
switch (state) {
- case JackTransportStopped:
- tstate = TransportStopped;
- break;
case JackTransportRolling:
tstate = TransportRolling;
break;
case JackTransportStarting:
tstate = TransportStarting;
break;
+ case JackTransportStopped:
+ tstate = TransportStopped;
+ break;
+ default:
+ // ignore "unofficial" states like JackTransportNetStarting (jackd2)
+ tstate_valid = false;
+ break;
}
- return engine.sync_callback (tstate, pos->frame);
+ if (tstate_valid) {
+ return engine.sync_callback (tstate, pos->frame);
+ }
return true;
}
bool
JACKAudioBackend::in_process_thread ()
{
+#ifdef COMPILER_MINGW
+ if (_main_thread == GetCurrentThread()) {
+ return true;
+ }
+#else // pthreads
+ if (pthread_equal (_main_thread, pthread_self()) != 0) {
+ return true;
+ }
+#endif
+
for (std::vector<jack_native_thread_t>::const_iterator i = _jack_threads.begin ();
i != _jack_threads.end(); i++) {
/* JACK doesn't do this for us when we use the wait API
*/
+#ifdef COMPILER_MINGW
+ _main_thread = GetCurrentThread();
+#else
+ _main_thread = pthread_self ();
+#endif
+
+
AudioEngine::thread_init_callback (this);
while (1) {
}
float
-JACKAudioBackend::cpu_load() const
+JACKAudioBackend::dsp_load() const
{
GET_PRIVATE_JACK_POINTER_RET(_priv_jack,0);
return jack_cpu_load (_priv_jack);
appname = "hdspconf";
} else if (_target_device == "M Audio Delta 1010") {
appname = "mudita24";
+ } else if (_target_device == "M2496") {
+ appname = "mudita24";
}
}
} else {
// don't adjust speed here, just leave it as it was
break;
default:
+ starting = true; // jack2: JackTransportNetStarting
std::cerr << "WARNING: Unknown JACK transport state: " << state << std::endl;
}
position = pos.frame;
return starting;
}
+
+int
+JACKAudioBackend::reset_device ()
+{
+ /* XXX need to figure out what this means for JACK
+ */
+ return 0;
+}