20 #include "JackAudioAdapter.h"
21 #include "JackError.h"
22 #include "JackCompilerDeps.h"
23 #include "JackTools.h"
35 int JackAudioAdapter::Process(jack_nframes_t frames,
void* arg)
37 JackAudioAdapter* adapter =
static_cast<JackAudioAdapter*
>(arg);
38 return adapter->ProcessAux(frames);
41 int JackAudioAdapter::ProcessAux(jack_nframes_t frames)
44 for (
int i = 0; i < fAudioAdapter->GetInputs(); i++) {
45 fInputBufferList[i] = (jack_default_audio_sample_t*)
jack_port_get_buffer(fCapturePortList[i], frames);
46 memset(fInputBufferList[i], 0, frames *
sizeof(jack_default_audio_sample_t));
49 for (
int i = 0; i < fAudioAdapter->GetOutputs(); i++) {
50 fOutputBufferList[i] = (jack_default_audio_sample_t*)
jack_port_get_buffer(fPlaybackPortList[i], frames);
53 fAudioAdapter->PullAndPush(fInputBufferList, fOutputBufferList, frames);
57 int JackAudioAdapter::BufferSize(jack_nframes_t buffer_size,
void* arg)
59 JackAudioAdapter* adapter =
static_cast<JackAudioAdapter*
>(arg);
61 adapter->fAudioAdapter->SetHostBufferSize(buffer_size);
65 int JackAudioAdapter::SampleRate(jack_nframes_t sample_rate,
void* arg)
67 JackAudioAdapter* adapter =
static_cast<JackAudioAdapter*
>(arg);
69 adapter->fAudioAdapter->SetHostSampleRate(sample_rate);
73 void JackAudioAdapter::Latency(jack_latency_callback_mode_t mode,
void* arg)
75 JackAudioAdapter* adapter =
static_cast<JackAudioAdapter*
>(arg);
77 if (mode == JackCaptureLatency) {
78 for (
int i = 0; i < adapter->fAudioAdapter->GetInputs(); i++) {
80 range.
min = range.
max = adapter->fAudioAdapter->GetInputLatency(i);
85 for (
int i = 0; i < adapter->fAudioAdapter->GetOutputs(); i++) {
87 range.
min = range.
max = adapter->fAudioAdapter->GetOutputLatency(i);
93 JackAudioAdapter::JackAudioAdapter(jack_client_t* client, JackAudioAdapterInterface* audio_io,
const JSList* params)
94 :fClient(client), fAudioAdapter(audio_io)
100 for (node = params; node; node = jack_slist_next(node)) {
102 switch (param->character) {
110 JackAudioAdapter::~JackAudioAdapter()
113 delete fAudioAdapter;
116 void JackAudioAdapter::FreePorts()
118 for (
int i = 0; i < fAudioAdapter->GetInputs(); i++) {
119 if (fCapturePortList[i]) {
123 for (
int i = 0; i < fAudioAdapter->GetOutputs(); i++) {
124 if (fPlaybackPortList[i]) {
129 delete[] fCapturePortList;
130 delete[] fPlaybackPortList;
132 delete[] fInputBufferList;
133 delete[] fOutputBufferList;
136 void JackAudioAdapter::ConnectPorts()
140 ports =
jack_get_ports(fClient, NULL, NULL, JackPortIsPhysical | JackPortIsInput);
142 for (
int i = 0; i < fAudioAdapter->GetInputs() && ports[i]; i++) {
148 ports =
jack_get_ports(fClient, NULL, NULL, JackPortIsPhysical | JackPortIsOutput);
150 for (
int i = 0; i < fAudioAdapter->GetOutputs() && ports[i]; i++) {
157 void JackAudioAdapter::Reset()
159 fAudioAdapter->Reset();
162 int JackAudioAdapter::Open()
165 jack_log(
"JackAudioAdapter::Open fCaptureChannels %d fPlaybackChannels %d", fAudioAdapter->GetInputs(), fAudioAdapter->GetOutputs());
166 fAudioAdapter->Create();
169 fCapturePortList =
new jack_port_t*[fAudioAdapter->GetInputs()];
170 fPlaybackPortList =
new jack_port_t*[fAudioAdapter->GetOutputs()];
172 fInputBufferList =
new jack_default_audio_sample_t*[fAudioAdapter->GetInputs()];
173 fOutputBufferList =
new jack_default_audio_sample_t*[fAudioAdapter->GetOutputs()];
175 for (
int i = 0; i < fAudioAdapter->GetInputs(); i++) {
176 snprintf(name,
sizeof(name),
"capture_%d", i + 1);
177 if ((fCapturePortList[i] =
jack_port_register(fClient, name, JACK_DEFAULT_AUDIO_TYPE, CaptureDriverFlags, 0)) == NULL) {
182 for (
int i = 0; i < fAudioAdapter->GetOutputs(); i++) {
183 snprintf(name,
sizeof(name),
"playback_%d", i + 1);
184 if ((fPlaybackPortList[i] =
jack_port_register(fClient, name, JACK_DEFAULT_AUDIO_TYPE, PlaybackDriverFlags, 0)) == NULL) {
199 if (jack_set_latency_callback(fClient, Latency,
this) < 0) {
211 return fAudioAdapter->Open();
216 fAudioAdapter->Destroy();
220 int JackAudioAdapter::Close()
222 fAudioAdapter->Close();
223 fAudioAdapter->Destroy();
LIB_EXPORT int jack_port_unregister(jack_client_t *, jack_port_t *)
LIB_EXPORT int jack_set_process_callback(jack_client_t *client, JackProcessCallback process_callback, void *arg)
LIB_EXPORT int jack_activate(jack_client_t *client)
LIB_EXPORT void jack_port_set_latency_range(jack_port_t *port, jack_latency_callback_mode_t mode, jack_latency_range_t *range)
LIB_EXPORT int jack_connect(jack_client_t *, const char *source_port, const char *destination_port)
LIB_EXPORT jack_port_t * jack_port_register(jack_client_t *client, const char *port_name, const char *port_type, unsigned long flags, unsigned long buffer_size)
LIB_EXPORT int jack_set_sample_rate_callback(jack_client_t *client, JackSampleRateCallback srate_callback, void *arg)
LIB_EXPORT void * jack_port_get_buffer(jack_port_t *, jack_nframes_t)
LIB_EXPORT int jack_set_buffer_size_callback(jack_client_t *client, JackBufferSizeCallback bufsize_callback, void *arg)
LIB_EXPORT const char * jack_port_name(const jack_port_t *port)
LIB_EXPORT const char ** jack_get_ports(jack_client_t *, const char *port_name_pattern, const char *type_name_pattern, unsigned long flags)
SERVER_EXPORT void jack_log(const char *fmt,...)