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 jack_default_audio_sample_t* inputBuffer[adapter->fAudioAdapter->GetInputs()];
39 jack_default_audio_sample_t* outputBuffer[adapter->fAudioAdapter->GetOutputs()];
42 for (
int i = 0; i < adapter->fAudioAdapter->GetInputs(); i++) {
43 inputBuffer[i] = (jack_default_audio_sample_t*)
jack_port_get_buffer(adapter->fCapturePortList[i], frames);
44 memset(inputBuffer[i], 0, frames *
sizeof(jack_default_audio_sample_t));
47 for (
int i = 0; i < adapter->fAudioAdapter->GetOutputs(); i++) {
48 outputBuffer[i] = (jack_default_audio_sample_t*)
jack_port_get_buffer(adapter->fPlaybackPortList[i], frames);
51 adapter->fAudioAdapter->PullAndPush(inputBuffer, outputBuffer, frames);
55 int JackAudioAdapter::BufferSize(jack_nframes_t buffer_size,
void* arg)
57 JackAudioAdapter* adapter =
static_cast<JackAudioAdapter*
>(arg);
59 adapter->fAudioAdapter->SetHostBufferSize(buffer_size);
63 int JackAudioAdapter::SampleRate(jack_nframes_t sample_rate,
void* arg)
65 JackAudioAdapter* adapter =
static_cast<JackAudioAdapter*
>(arg);
67 adapter->fAudioAdapter->SetHostSampleRate(sample_rate);
71 void JackAudioAdapter::Latency(jack_latency_callback_mode_t mode,
void* arg)
73 JackAudioAdapter* adapter =
static_cast<JackAudioAdapter*
>(arg);
75 if (mode == JackCaptureLatency) {
76 for (
int i = 0; i < adapter->fAudioAdapter->GetInputs(); i++) {
78 range.
min = range.
max = adapter->fAudioAdapter->GetInputLatency(i);
83 for (
int i = 0; i < adapter->fAudioAdapter->GetOutputs(); i++) {
85 range.
min = range.
max = adapter->fAudioAdapter->GetOutputLatency(i);
91 JackAudioAdapter::JackAudioAdapter(jack_client_t* client, JackAudioAdapterInterface* audio_io,
const JSList* params)
92 :fClient(client), fAudioAdapter(audio_io)
98 for (node = params; node; node = jack_slist_next(node)) {
100 switch (param->character) {
108 JackAudioAdapter::~JackAudioAdapter()
111 delete fAudioAdapter;
114 void JackAudioAdapter::FreePorts()
116 for (
int i = 0; i < fAudioAdapter->GetInputs(); i++) {
117 if (fCapturePortList[i]) {
121 for (
int i = 0; i < fAudioAdapter->GetOutputs(); i++) {
122 if (fPlaybackPortList[i]) {
127 delete[] fCapturePortList;
128 delete[] fPlaybackPortList;
131 void JackAudioAdapter::ConnectPorts()
135 ports =
jack_get_ports(fClient, NULL, NULL, JackPortIsPhysical | JackPortIsInput);
137 for (
int i = 0; i < fAudioAdapter->GetInputs() && ports[i]; i++) {
143 ports =
jack_get_ports(fClient, NULL, NULL, JackPortIsPhysical | JackPortIsOutput);
145 for (
int i = 0; i < fAudioAdapter->GetOutputs() && ports[i]; i++) {
152 void JackAudioAdapter::Reset()
154 fAudioAdapter->Reset();
157 int JackAudioAdapter::Open()
160 jack_log(
"JackAudioAdapter::Open fCaptureChannels %d fPlaybackChannels %d", fAudioAdapter->GetInputs(), fAudioAdapter->GetOutputs());
161 fAudioAdapter->Create();
164 fCapturePortList =
new jack_port_t*[fAudioAdapter->GetInputs()];
165 fPlaybackPortList =
new jack_port_t*[fAudioAdapter->GetOutputs()];
167 for (
int i = 0; i < fAudioAdapter->GetInputs(); i++) {
168 snprintf(name,
sizeof(name),
"capture_%d", i + 1);
169 if ((fCapturePortList[i] =
jack_port_register(fClient, name, JACK_DEFAULT_AUDIO_TYPE, CaptureDriverFlags, 0)) == NULL) {
174 for (
int i = 0; i < fAudioAdapter->GetOutputs(); i++) {
175 snprintf(name,
sizeof(name),
"playback_%d", i + 1);
176 if ((fPlaybackPortList[i] =
jack_port_register(fClient, name, JACK_DEFAULT_AUDIO_TYPE, PlaybackDriverFlags, 0)) == NULL) {
191 if (jack_set_latency_callback(fClient, Latency,
this) < 0) {
194 if (jack_activate(fClient) < 0) {
203 return fAudioAdapter->Open();
208 fAudioAdapter->Destroy();
212 int JackAudioAdapter::Close()
214 fAudioAdapter->Close();
215 fAudioAdapter->Destroy();