00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "JackAudioAdapter.h"
00021 #include "JackLibSampleRateResampler.h"
00022 #include "JackError.h"
00023 #include "JackCompilerDeps.h"
00024 #include "JackTools.h"
00025 #include "jslist.h"
00026 #include <stdio.h>
00027 #include <stdlib.h>
00028 #include <assert.h>
00029
00030 using namespace std;
00031
00032 namespace Jack
00033 {
00034
00035
00036 int JackAudioAdapter::Process ( jack_nframes_t frames, void* arg )
00037 {
00038 JackAudioAdapter* adapter = static_cast<JackAudioAdapter*> ( arg );
00039 float* buffer;
00040 bool failure = false;
00041 int i;
00042
00043 if ( !adapter->fAudioAdapter->IsRunning() )
00044 return 0;
00045
00046
00047 adapter->fAudioAdapter->SetCallbackTime ( jack_get_time() );
00048
00049
00050 for ( i = 0; i < adapter->fCaptureChannels; i++ )
00051 {
00052 buffer = static_cast<float*> ( jack_port_get_buffer ( adapter->fCapturePortList[i], frames ) );
00053 if ( adapter->fCaptureRingBuffer[i]->Read ( buffer, frames ) < frames )
00054 failure = true;
00055 }
00056
00057 for ( i = 0; i < adapter->fPlaybackChannels; i++ )
00058 {
00059 buffer = static_cast<float*> ( jack_port_get_buffer ( adapter->fPlaybackPortList[i], frames ) );
00060 if ( adapter->fPlaybackRingBuffer[i]->Write ( buffer, frames ) < frames )
00061 failure = true;
00062 }
00063
00064
00065 if ( failure )
00066 {
00067 jack_error ( "JackCallbackAudioAdapter::Process ringbuffer failure... reset" );
00068 adapter->Reset();
00069 }
00070 return 0;
00071 }
00072
00073 int JackAudioAdapter::BufferSize ( jack_nframes_t buffer_size, void* arg )
00074 {
00075 JackAudioAdapter* adapter = static_cast<JackAudioAdapter*> ( arg );
00076 adapter->Reset();
00077 adapter->fAudioAdapter->SetHostBufferSize ( buffer_size );
00078 return 0;
00079 }
00080
00081 int JackAudioAdapter::SampleRate ( jack_nframes_t sample_rate, void* arg )
00082 {
00083 JackAudioAdapter* adapter = static_cast<JackAudioAdapter*> ( arg );
00084 adapter->Reset();
00085 adapter->fAudioAdapter->SetHostSampleRate ( sample_rate );
00086 return 0;
00087 }
00088
00089
00090 JackAudioAdapter::~JackAudioAdapter()
00091 {
00092
00093 int i;
00094 for ( i = 0; i < fCaptureChannels; i++ )
00095 delete ( fCaptureRingBuffer[i] );
00096 for ( i = 0; i < fPlaybackChannels; i++ )
00097 delete ( fPlaybackRingBuffer[i] );
00098
00099 delete[] fCaptureRingBuffer;
00100 delete[] fPlaybackRingBuffer;
00101 delete fAudioAdapter;
00102 }
00103
00104 void JackAudioAdapter::FreePorts()
00105 {
00106 int i;
00107 for ( i = 0; i < fCaptureChannels; i++ )
00108 if ( fCapturePortList[i] )
00109 jack_port_unregister ( fJackClient, fCapturePortList[i] );
00110 for ( i = 0; i < fCaptureChannels; i++ )
00111 if ( fPlaybackPortList[i] )
00112 jack_port_unregister ( fJackClient, fPlaybackPortList[i] );
00113
00114 delete[] fCapturePortList;
00115 delete[] fPlaybackPortList;
00116 }
00117
00118 void JackAudioAdapter::Reset()
00119 {
00120 int i;
00121 for ( i = 0; i < fCaptureChannels; i++ )
00122 fCaptureRingBuffer[i]->Reset();
00123 for ( i = 0; i < fPlaybackChannels; i++ )
00124 fPlaybackRingBuffer[i]->Reset();
00125 fAudioAdapter->Reset();
00126 }
00127
00128 int JackAudioAdapter::Open()
00129 {
00130 int i;
00131 char name[32];
00132
00133 fCaptureChannels = fAudioAdapter->GetInputs();
00134 fPlaybackChannels = fAudioAdapter->GetOutputs();
00135
00136 jack_log ( "JackAudioAdapter::Open fCaptureChannels %d fPlaybackChannels %d", fCaptureChannels, fPlaybackChannels );
00137
00138
00139 fCaptureRingBuffer = new JackResampler*[fCaptureChannels];
00140 fPlaybackRingBuffer = new JackResampler*[fPlaybackChannels];
00141 for ( i = 0; i < fCaptureChannels; i++ )
00142 fCaptureRingBuffer[i] = new JackLibSampleRateResampler(fAudioAdapter->GetQuality());
00143 for ( i = 0; i < fPlaybackChannels; i++ )
00144 fPlaybackRingBuffer[i] = new JackLibSampleRateResampler(fAudioAdapter->GetQuality());
00145 fAudioAdapter->SetRingBuffers ( fCaptureRingBuffer, fPlaybackRingBuffer );
00146 if ( fCaptureChannels )
00147 jack_log ( "ReadSpace = %ld", fCaptureRingBuffer[0]->ReadSpace() );
00148 if ( fPlaybackChannels )
00149 jack_log ( "WriteSpace = %ld", fPlaybackRingBuffer[0]->WriteSpace() );
00150
00151
00152 fCapturePortList = new jack_port_t* [fCaptureChannels];
00153 fPlaybackPortList = new jack_port_t* [fPlaybackChannels];
00154
00155 for ( i = 0; i < fCaptureChannels; i++ )
00156 {
00157 sprintf ( name, "capture_%d", i+1 );
00158 if ( ( fCapturePortList[i] = jack_port_register ( fJackClient, name, JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0 ) ) == NULL )
00159 goto fail;
00160 }
00161
00162 for ( i = 0; i < fPlaybackChannels; i++ )
00163 {
00164 sprintf ( name, "playback_%d", i+1 );
00165 if ( ( fPlaybackPortList[i] = jack_port_register ( fJackClient, name, JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0 ) ) == NULL )
00166 goto fail;
00167 }
00168
00169
00170 if ( jack_set_process_callback ( fJackClient, Process, this ) < 0 )
00171 goto fail;
00172 if ( jack_set_buffer_size_callback ( fJackClient, BufferSize, this ) < 0 )
00173 goto fail;
00174 if ( jack_set_sample_rate_callback ( fJackClient, SampleRate, this ) < 0 )
00175 goto fail;
00176 if ( jack_activate ( fJackClient ) < 0 )
00177 goto fail;
00178
00179
00180 return fAudioAdapter->Open();
00181
00182 fail:
00183 FreePorts();
00184 return -1;
00185 }
00186
00187 int JackAudioAdapter::Close()
00188 {
00189 return fAudioAdapter->Close();
00190 }
00191
00192 }