| @@ -203,7 +203,7 @@ int JackAudioDriver::Process() | |||||
| } | } | ||||
| /* | /* | ||||
| The driver ASYNC mode: output buffers computed at the *previous cycle* are used, the server does not | |||||
| The driver "asynchronous" mode: output buffers computed at the *previous cycle* are used, the server does not | |||||
| synchronize to the end of client graph execution. | synchronize to the end of client graph execution. | ||||
| */ | */ | ||||
| @@ -239,6 +239,10 @@ void JackAudioDriver::ProcessGraphAsync() | |||||
| } | } | ||||
| } | } | ||||
| /* | |||||
| Used when the driver works in master mode. | |||||
| */ | |||||
| void JackAudioDriver::ProcessGraphAsyncMaster() | void JackAudioDriver::ProcessGraphAsyncMaster() | ||||
| { | { | ||||
| // fBeginDateUst is set in the "low level" layer, fEndDateUst is from previous cycle | // fBeginDateUst is set in the "low level" layer, fEndDateUst is from previous cycle | ||||
| @@ -261,6 +265,10 @@ void JackAudioDriver::ProcessGraphAsyncMaster() | |||||
| // Does not wait on graph execution end | // Does not wait on graph execution end | ||||
| } | } | ||||
| /* | |||||
| Used when the driver works in slave mode. | |||||
| */ | |||||
| void JackAudioDriver::ProcessGraphAsyncSlave() | void JackAudioDriver::ProcessGraphAsyncSlave() | ||||
| { | { | ||||
| if (ResumeRefNum() < 0) { | if (ResumeRefNum() < 0) { | ||||
| @@ -269,7 +277,7 @@ void JackAudioDriver::ProcessGraphAsyncSlave() | |||||
| } | } | ||||
| /* | /* | ||||
| The driver SYNC mode: the server does synchronize to the end of client graph execution, | |||||
| The driver "synchronous" mode: the server does synchronize to the end of client graph execution, | |||||
| if graph process succeed, output buffers computed at the *current cycle* are used. | if graph process succeed, output buffers computed at the *current cycle* are used. | ||||
| */ | */ | ||||
| @@ -305,6 +313,10 @@ void JackAudioDriver::ProcessGraphSync() | |||||
| } | } | ||||
| } | } | ||||
| /* | |||||
| Used when the driver works in master mode. | |||||
| */ | |||||
| void JackAudioDriver::ProcessGraphSyncMaster() | void JackAudioDriver::ProcessGraphSyncMaster() | ||||
| { | { | ||||
| // fBeginDateUst is set in the "low level" layer, fEndDateUst is from previous cycle | // fBeginDateUst is set in the "low level" layer, fEndDateUst is from previous cycle | ||||
| @@ -332,6 +344,10 @@ void JackAudioDriver::ProcessGraphSyncMaster() | |||||
| } | } | ||||
| } | } | ||||
| /* | |||||
| Used when the driver works in slave mode. | |||||
| */ | |||||
| void JackAudioDriver::ProcessGraphSyncSlave() | void JackAudioDriver::ProcessGraphSyncSlave() | ||||
| { | { | ||||
| if (ResumeRefNum() < 0) { | if (ResumeRefNum() < 0) { | ||||
| @@ -28,6 +28,15 @@ namespace Jack | |||||
| /*! | /*! | ||||
| \brief The base class for audio drivers: drivers with audio ports. | \brief The base class for audio drivers: drivers with audio ports. | ||||
| A concrete derived class will have to be defined with a real audio driver API, | |||||
| either callback based one (like CoreAudio, PortAudio..) ones or blocking ones (like ALSA). | |||||
| Most of the generic audio handing code is part of this class : | |||||
| - concrete callback basedd derived subclasses typically have to Open/Close the underlying audio API, | |||||
| setup the audio callback and implement the Read/Write methods | |||||
| - concrete blocking based derived subclasses typically have to Open/Close the underlying audio API, | |||||
| implement the Read/Write methods and "wraps" the driver with the JackThreadDriver class. | |||||
| */ | */ | ||||
| class SERVER_EXPORT JackAudioDriver : public JackDriver | class SERVER_EXPORT JackAudioDriver : public JackDriver | ||||
| @@ -69,6 +78,10 @@ class SERVER_EXPORT JackAudioDriver : public JackDriver | |||||
| jack_nframes_t capture_latency, | jack_nframes_t capture_latency, | ||||
| jack_nframes_t playback_latency); | jack_nframes_t playback_latency); | ||||
| /* | |||||
| To be called by the underlying driver audio callback, or possibly by a RT thread (using JackThreadedDriver decorator) | |||||
| when a blocking read/write underlying API is used (like ALSA) | |||||
| */ | |||||
| virtual int Process(); | virtual int Process(); | ||||
| virtual int Attach(); | virtual int Attach(); | ||||
| @@ -95,9 +95,11 @@ class SERVER_EXPORT JackDriverInterface | |||||
| virtual int ProcessRead() = 0; | virtual int ProcessRead() = 0; | ||||
| virtual int ProcessWrite() = 0; | virtual int ProcessWrite() = 0; | ||||
| // For "slave" driver in "synchronous" mode | |||||
| virtual int ProcessReadSync() = 0; | virtual int ProcessReadSync() = 0; | ||||
| virtual int ProcessWriteSync() = 0; | virtual int ProcessWriteSync() = 0; | ||||
| // For "slave" driver in "asynchronous" mode | |||||
| virtual int ProcessReadAsync() = 0; | virtual int ProcessReadAsync() = 0; | ||||
| virtual int ProcessWriteAsync() = 0; | virtual int ProcessWriteAsync() = 0; | ||||
| @@ -231,15 +233,17 @@ class SERVER_EXPORT JackDriver : public JackDriverClientInterface | |||||
| int ProcessReadSlaves(); | int ProcessReadSlaves(); | ||||
| int ProcessWriteSlaves(); | int ProcessWriteSlaves(); | ||||
| // For "slave" driver | |||||
| int ProcessRead(); | |||||
| int ProcessWrite(); | |||||
| // For "slave" driver with typically decompose a given cycle in separated Read and Write parts. | |||||
| virtual int ProcessRead(); | |||||
| virtual int ProcessWrite(); | |||||
| int ProcessReadSync(); | |||||
| int ProcessWriteSync(); | |||||
| // For "slave" driver in "synchronous" mode | |||||
| virtual int ProcessReadSync(); | |||||
| virtual int ProcessWriteSync(); | |||||
| int ProcessReadAsync(); | |||||
| int ProcessWriteAsync(); | |||||
| // For "slave" driver in "asynchronous" mode | |||||
| virtual int ProcessReadAsync(); | |||||
| virtual int ProcessWriteAsync(); | |||||
| virtual bool IsFixedBufferSize(); | virtual bool IsFixedBufferSize(); | ||||
| virtual int SetBufferSize(jack_nframes_t buffer_size); | virtual int SetBufferSize(jack_nframes_t buffer_size); | ||||
| @@ -30,6 +30,10 @@ namespace Jack | |||||
| /*! | /*! | ||||
| \brief The base class for MIDI drivers: drivers with MIDI ports. | \brief The base class for MIDI drivers: drivers with MIDI ports. | ||||
| A concrete derived class will have to be defined with a real MIDI driver API, | |||||
| either callback based one (like CoreMIDI..) ones or blocking ones (like ALSA MIDI). | |||||
| */ | */ | ||||
| class SERVER_EXPORT JackMidiDriver : public JackDriver | class SERVER_EXPORT JackMidiDriver : public JackDriver | ||||