Browse Source

jack common: add api jack_client_reload_master

later used to restart JackAlsaDriver and allow closing unused devices
(devices whose ports are are not connected)

Change-Id: I886e4b23949e2a5e321194c18043f00f434537cc
Signed-off-by: Adam Miartus <amiartus@de.adit-jv.com>
(cherry picked from commit 39a31b50b3)
Signed-off-by: Timo Wischer <twischer@de.adit-jv.com>
pull/608/head
Adam Miartus Timo Wischer 6 years ago
parent
commit
4ed6112e60
15 changed files with 125 additions and 0 deletions
  1. +16
    -0
      common/JackAPI.cpp
  2. +3
    -0
      common/JackChannel.h
  3. +7
    -0
      common/JackClient.cpp
  4. +2
    -0
      common/JackClient.h
  5. +5
    -0
      common/JackDriver.cpp
  6. +2
    -0
      common/JackDriver.h
  7. +7
    -0
      common/JackGenericClientChannel.cpp
  8. +2
    -0
      common/JackGenericClientChannel.h
  9. +26
    -0
      common/JackRequest.h
  10. +10
    -0
      common/JackRequestDecoder.cpp
  11. +5
    -0
      common/JackServer.cpp
  12. +1
    -0
      common/JackServer.h
  13. +22
    -0
      common/JackThreadedDriver.cpp
  14. +1
    -0
      common/JackThreadedDriver.h
  15. +16
    -0
      common/jack/jack.h

+ 16
- 0
common/JackAPI.cpp View File

@@ -277,6 +277,8 @@ extern "C"
LIB_EXPORT void jack_uuid_unparse(jack_uuid_t, char buf[JACK_UUID_STRING_SIZE]);
LIB_EXPORT int jack_uuid_empty(jack_uuid_t);

LIB_EXPORT int jack_client_reload_master(jack_client_t* ext_client);

#ifdef __cplusplus
}
#endif
@@ -2140,3 +2142,17 @@ LIB_EXPORT int jack_uuid_empty(jack_uuid_t u)
{
return u == JACK_UUID_EMPTY_INITIALIZER;
}

LIB_EXPORT int jack_client_reload_master(jack_client_t* ext_client)
{
JackGlobals::CheckContext("jack_client_reload_master");

JackClient* client = (JackClient*)ext_client;
if (client == NULL) {
jack_error("jack_client_reload_master called with a NULL client");
return -1;
} else {
WaitGraphChange();
return client->ClientReloadMaster();
}
}

+ 3
- 0
common/JackChannel.h View File

@@ -137,6 +137,9 @@ class JackClientChannelInterface
virtual void ClientDeactivate(int refnum, int* result)
{}

virtual void ClientReloadMaster(int* result)
{}

virtual void PortRegister(int refnum, const char* name, const char* type, unsigned int flags, unsigned int buffer_size, jack_port_id_t* port_index, int* result)
{}
virtual void PortUnRegister(int refnum, jack_port_id_t port_index, int* result)


+ 7
- 0
common/JackClient.cpp View File

@@ -502,6 +502,13 @@ int JackClient::Deactivate()
if (IsRealTime()) {
fThread.Kill();
}
return result;
}

int JackClient::ClientReloadMaster()
{
int result = -1;
fChannel->ClientReloadMaster(&result);
return result;
}



+ 2
- 0
common/JackClient.h View File

@@ -145,6 +145,8 @@ class SERVER_EXPORT JackClient : public JackClientInterface, public JackRunnable
virtual int Activate();
virtual int Deactivate();

virtual int ClientReloadMaster();

// Context
virtual int SetBufferSize(jack_nframes_t buffer_size);
virtual int SetFreeWheel(int onoff);


+ 5
- 0
common/JackDriver.cpp View File

@@ -351,6 +351,11 @@ int JackDriver::Stop()
return StopSlaves();
}

int JackDriver::Reload()
{
return 0;
}

int JackDriver::StartSlaves()
{
int res = 0;


+ 2
- 0
common/JackDriver.h View File

@@ -72,6 +72,7 @@ class SERVER_EXPORT JackDriverInterface

virtual int Start() = 0;
virtual int Stop() = 0;
virtual int Reload() = 0;

virtual bool IsFixedBufferSize() = 0;
virtual int SetBufferSize(jack_nframes_t buffer_size) = 0;
@@ -227,6 +228,7 @@ class SERVER_EXPORT JackDriver : public JackDriverClientInterface

virtual int Start();
virtual int Stop();
virtual int Reload();

// For "master" driver
int ProcessReadSlaves();


+ 7
- 0
common/JackGenericClientChannel.cpp View File

@@ -137,6 +137,13 @@ void JackGenericClientChannel::ClientDeactivate(int refnum, int* result)
ServerSyncCall(&req, &res, result);
}

void JackGenericClientChannel::ClientReloadMaster(int *result)
{
JackClientReloadMasterRequest req;
JackResult res;
ServerSyncCall(&req, &res, result);
}

void JackGenericClientChannel::PortRegister(int refnum, const char* name, const char* type, unsigned int flags, unsigned int buffer_size, jack_port_id_t* port_index, int* result)
{
JackPortRegisterRequest req(refnum, name, type, flags, buffer_size);


+ 2
- 0
common/JackGenericClientChannel.h View File

@@ -62,6 +62,8 @@ class JackGenericClientChannel : public detail::JackClientChannelInterface
void ClientActivate(int refnum, int is_real_time, int* result);
void ClientDeactivate(int refnum, int* result);

void ClientReloadMaster(int* result);

void PortRegister(int refnum, const char* name, const char* type, unsigned int flags, unsigned int buffer_size, jack_port_id_t* port_index, int* result);
void PortUnRegister(int refnum, jack_port_id_t port_index, int* result);



+ 26
- 0
common/JackRequest.h View File

@@ -91,6 +91,7 @@ struct JackRequest
kClientHasSessionCallback = 38,
kComputeTotalLatencies = 39,
kPropertyChangeNotify = 40,
kClientReloadMaster = 41,
};

RequestType fType;
@@ -1736,6 +1737,31 @@ struct JackClientNotification

};

/*!
\brief Restart Master Backend Request.
*/

struct JackClientReloadMasterRequest : public JackRequest
{
JackClientReloadMasterRequest(): JackRequest(JackRequest::kClientReloadMaster)
{
}

int Read(detail::JackChannelTransactionInterface* trans)
{
CheckSize();
return 0;
}

int Write(detail::JackChannelTransactionInterface* trans)
{
CheckRes(JackRequest::Write(trans, Size()));
return 0;
}

int Size() { return 0; }
};

} // end of namespace

#endif

+ 10
- 0
common/JackRequestDecoder.cpp View File

@@ -346,6 +346,16 @@ int JackRequestDecoder::HandleRequest(detail::JackChannelTransactionInterface* s
break;
}

case JackRequest::kClientReloadMaster: {
jack_log("JackRequest::ClientReloadMaster");
JackClientReloadMasterRequest req;
JackResult res;
CheckRead(req, socket);
res.fResult = fServer->ReloadMaster();
CheckWrite("JackRequest::ClientReloadMaster", socket);
break;
}

default:
jack_error("Unknown request %ld", type);
return -1;


+ 5
- 0
common/JackServer.cpp View File

@@ -430,6 +430,11 @@ error:
return -1;
}

int JackServer::ReloadMaster()
{
return fAudioDriver->Reload();
}

//----------------------
// Transport management
//----------------------


+ 1
- 0
common/JackServer.h View File

@@ -98,6 +98,7 @@ class SERVER_EXPORT JackServer
JackDriverInfo* AddSlave(jack_driver_desc_t* driver_desc, JSList* driver_params);
void RemoveSlave(JackDriverInfo* info);
int SwitchMaster(jack_driver_desc_t* driver_desc, JSList* driver_params);
int ReloadMaster();

// Object access
JackLockedEngine* GetEngine();


+ 22
- 0
common/JackThreadedDriver.cpp View File

@@ -239,6 +239,28 @@ int JackThreadedDriver::Stop()
return 0;
}

int JackThreadedDriver::Reload()
{
if (Stop() < 0) {
jack_error("JackThreadedDriver::Reload stop failed");
return -1;
}

// not able to use Close() and Open() since we dont have original Open() parameters, these
// are internal to fDriver, reload should reopen with same parameters
if (fDriver->Reload() < 0) {
jack_error("JackThreadedDriver::Reload reload failed");
return -1;
}

if (Start() < 0) {
jack_error("JackThreadedDriver::Reload start failed");
return -1;
}

return 0;
}

bool JackThreadedDriver::Execute()
{
return (Process() == 0);


+ 1
- 0
common/JackThreadedDriver.h View File

@@ -70,6 +70,7 @@ class SERVER_EXPORT JackThreadedDriver : public JackDriverClientInterface, publi

virtual int Start();
virtual int Stop();
virtual int Reload();

virtual bool IsFixedBufferSize();
virtual int SetBufferSize(jack_nframes_t buffer_size);


+ 16
- 0
common/jack/jack.h View File

@@ -139,6 +139,22 @@ int jack_client_close (jack_client_t *client) JACK_OPTIONAL_WEAK_EXPORT;
*/
int jack_client_name_size (void) JACK_OPTIONAL_WEAK_EXPORT;

/**
* Reloads audio backend.
*
* This is useful when client wants audio backend to reload its state.
* Currently used only for alsa audio backend.
*
* Alsa backend will close or open audio devices on reload depending on
* the state of the ports asociated with audio device. If all ports
* are disconnected audio device is closed, opened otherwise. This
* behaviour is modifiable by alsa backend options provided to jackd
* on startup.
*
* @return 0 if successful.
*/
int jack_client_reload_master(jack_client_t* ext_client) JACK_OPTIONAL_WEAK_EXPORT;

/**
* @return pointer to actual client name. This is useful when @ref
* JackUseExactName is not specified on open and @ref


Loading…
Cancel
Save