From c764ef28020ac4b7454e7c7df054fc5a29253995 Mon Sep 17 00:00:00 2001 From: sletz Date: Thu, 14 Apr 2011 13:04:20 +0000 Subject: [PATCH 01/12] Cleanup JackPortAudioAdapter. git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@4302 0c269be4-1314-0410-8aa9-9f06e86f4224 --- windows/portaudio/JackPortAudioAdapter.cpp | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/windows/portaudio/JackPortAudioAdapter.cpp b/windows/portaudio/JackPortAudioAdapter.cpp index 79f0b34d..095202f9 100644 --- a/windows/portaudio/JackPortAudioAdapter.cpp +++ b/windows/portaudio/JackPortAudioAdapter.cpp @@ -50,7 +50,7 @@ namespace Jack int out_max = 0; fInputDevice = Pa_GetDefaultInputDevice(); - fOutputDevice = Pa_GetDefaultOutputDevice(); + fOutputDevice = Pa_GetDefaultOutputDevice(); for (node = params; node; node = jack_slist_next(node)) { @@ -117,22 +117,19 @@ namespace Jack //set adapter interface channels SetInputs ( fCaptureChannels ); - SetOutputs ( fPlaybackChannels ); + SetOutputs ( fPlaybackChannels ); } int JackPortAudioAdapter::Open() { PaError err; PaStreamParameters inputParameters; - PaStreamParameters outputParameters; - - if (fInputDevice == paNoDevice && fOutputDevice == paNoDevice) { - jack_error("No input and output device!!"); - return -1; - } + PaStreamParameters outputParameters; - if ( JackAudioAdapterInterface::Open() < 0 ) + if (fInputDevice == paNoDevice && fOutputDevice == paNoDevice) { + jack_error("No input and output device!!"); return -1; + } jack_log("JackPortAudioAdapter::Open fInputDevice = %d DeviceName %s", fInputDevice, fPaDevices.GetFullName(fInputDevice).c_str()); jack_log("JackPortAudioAdapter::Open fOutputDevice = %d DeviceName %s", fOutputDevice, fPaDevices.GetFullName(fOutputDevice).c_str()); @@ -191,7 +188,7 @@ namespace Jack jack_log ( "JackPortAudioAdapter:: Pa_StopStream" ); Pa_CloseStream ( fStream ); jack_log ( "JackPortAudioAdapter:: Pa_CloseStream" ); - return JackAudioAdapterInterface::Close(); + return 0; } int JackPortAudioAdapter::SetSampleRate ( jack_nframes_t sample_rate ) @@ -314,3 +311,4 @@ extern "C" #ifdef __cplusplus } #endif + From 440ff36c881a0ffd504d9f62affdd8e0a319d6f2 Mon Sep 17 00:00:00 2001 From: sletz Date: Thu, 14 Apr 2011 15:24:01 +0000 Subject: [PATCH 02/12] Correct JackNetDriver::Initialize. git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@4303 0c269be4-1314-0410-8aa9-9f06e86f4224 --- common/JackNetDriver.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/common/JackNetDriver.cpp b/common/JackNetDriver.cpp index 9551aac0..e2031257 100644 --- a/common/JackNetDriver.cpp +++ b/common/JackNetDriver.cpp @@ -124,7 +124,8 @@ namespace Jack bool JackNetDriver::Initialize() { - jack_log("JackNetDriver::Initialize() "); + jack_log("JackNetDriver::Initialize()"); + FreePorts(); //new loading, but existing socket, restart the driver if (fSocket.IsSocket()) { @@ -373,29 +374,33 @@ namespace Jack int JackNetDriver::FreePorts() { - jack_log ( "JackNetDriver::FreePorts" ); + jack_log("JackNetDriver::FreePorts"); for (int audio_port_index = 0; audio_port_index < fCaptureChannels; audio_port_index++) { if (fCapturePortList[audio_port_index] > 0) { fGraphManager->ReleasePort ( fClientControl.fRefNum, fCapturePortList[audio_port_index]); + fCapturePortList[audio_port_index] = 0; } } for (int audio_port_index = 0; audio_port_index < fPlaybackChannels; audio_port_index++) { if (fPlaybackPortList[audio_port_index] > 0) { fGraphManager->ReleasePort ( fClientControl.fRefNum, fPlaybackPortList[audio_port_index]); + fPlaybackPortList[audio_port_index] = 0; } } for (int midi_port_index = 0; midi_port_index < fParams.fSendMidiChannels; midi_port_index++) { if (fMidiCapturePortList && fMidiCapturePortList[midi_port_index] > 0) { fGraphManager->ReleasePort ( fClientControl.fRefNum, fMidiCapturePortList[midi_port_index]); + fMidiCapturePortList[midi_port_index] =0; } } for (int midi_port_index = 0; midi_port_index < fParams.fReturnMidiChannels; midi_port_index++) { if (fMidiPlaybackPortList && fMidiPlaybackPortList[midi_port_index] > 0) { fGraphManager->ReleasePort ( fClientControl.fRefNum, fMidiPlaybackPortList[midi_port_index]); + fMidiPlaybackPortList[midi_port_index] = 0; } } // Clear MIDI channels From 79a5f3a537357fadf2d69b6dc835a672ec68a26c Mon Sep 17 00:00:00 2001 From: sletz Date: Thu, 14 Apr 2011 15:38:31 +0000 Subject: [PATCH 03/12] Correct warning. git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@4304 0c269be4-1314-0410-8aa9-9f06e86f4224 --- common/netjack.c | 2 ++ common/netjack_packet.c | 2 ++ 2 files changed, 4 insertions(+) diff --git a/common/netjack.c b/common/netjack.c index 34c32fb9..1184e207 100644 --- a/common/netjack.c +++ b/common/netjack.c @@ -58,6 +58,8 @@ $Id: net_driver.c,v 1.17 2006/04/16 20:16:10 torbenh Exp $ #include "netjack.h" #include "netjack_packet.h" +#include "JackError.h" + #define MIN(x,y) ((x)<(y) ? (x) : (y)) static int sync_state = 1; diff --git a/common/netjack_packet.c b/common/netjack_packet.c index 52e7c7ad..473cf3a2 100644 --- a/common/netjack_packet.c +++ b/common/netjack_packet.c @@ -74,6 +74,8 @@ #include "netjack_packet.h" +#include "JackError.h" + #ifdef NO_JACK_ERROR #define jack_error printf #endif From 3ddcd74be037a78e397de66def30ab656847ec06 Mon Sep 17 00:00:00 2001 From: sletz Date: Thu, 14 Apr 2011 15:52:35 +0000 Subject: [PATCH 04/12] Cleanup, remove warning. git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@4305 0c269be4-1314-0410-8aa9-9f06e86f4224 --- common/JackNetDriver.cpp | 10 +++++----- common/netjack.c | 4 ++-- common/netjack_packet.c | 4 ++-- example-clients/showtime.c | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/common/JackNetDriver.cpp b/common/JackNetDriver.cpp index e2031257..7ccc668f 100644 --- a/common/JackNetDriver.cpp +++ b/common/JackNetDriver.cpp @@ -378,28 +378,28 @@ namespace Jack for (int audio_port_index = 0; audio_port_index < fCaptureChannels; audio_port_index++) { if (fCapturePortList[audio_port_index] > 0) { - fGraphManager->ReleasePort ( fClientControl.fRefNum, fCapturePortList[audio_port_index]); + fGraphManager->ReleasePort(fClientControl.fRefNum, fCapturePortList[audio_port_index]); fCapturePortList[audio_port_index] = 0; } } for (int audio_port_index = 0; audio_port_index < fPlaybackChannels; audio_port_index++) { if (fPlaybackPortList[audio_port_index] > 0) { - fGraphManager->ReleasePort ( fClientControl.fRefNum, fPlaybackPortList[audio_port_index]); + fGraphManager->ReleasePort(fClientControl.fRefNum, fPlaybackPortList[audio_port_index]); fPlaybackPortList[audio_port_index] = 0; } } for (int midi_port_index = 0; midi_port_index < fParams.fSendMidiChannels; midi_port_index++) { if (fMidiCapturePortList && fMidiCapturePortList[midi_port_index] > 0) { - fGraphManager->ReleasePort ( fClientControl.fRefNum, fMidiCapturePortList[midi_port_index]); - fMidiCapturePortList[midi_port_index] =0; + fGraphManager->ReleasePort(fClientControl.fRefNum, fMidiCapturePortList[midi_port_index]); + fMidiCapturePortList[midi_port_index] = 0; } } for (int midi_port_index = 0; midi_port_index < fParams.fReturnMidiChannels; midi_port_index++) { if (fMidiPlaybackPortList && fMidiPlaybackPortList[midi_port_index] > 0) { - fGraphManager->ReleasePort ( fClientControl.fRefNum, fMidiPlaybackPortList[midi_port_index]); + fGraphManager->ReleasePort(fClientControl.fRefNum, fMidiPlaybackPortList[midi_port_index]); fMidiPlaybackPortList[midi_port_index] = 0; } } diff --git a/common/netjack.c b/common/netjack.c index 1184e207..2b7eeb0d 100644 --- a/common/netjack.c +++ b/common/netjack.c @@ -55,11 +55,11 @@ $Id: net_driver.c,v 1.17 2006/04/16 20:16:10 torbenh Exp $ #include #endif +#include "JackError.h" + #include "netjack.h" #include "netjack_packet.h" -#include "JackError.h" - #define MIN(x,y) ((x)<(y) ? (x) : (y)) static int sync_state = 1; diff --git a/common/netjack_packet.c b/common/netjack_packet.c index 473cf3a2..21457798 100644 --- a/common/netjack_packet.c +++ b/common/netjack_packet.c @@ -68,14 +68,14 @@ #include #endif +#include "JackError.h" + #if HAVE_CELT #include #endif #include "netjack_packet.h" -#include "JackError.h" - #ifdef NO_JACK_ERROR #define jack_error printf #endif diff --git a/example-clients/showtime.c b/example-clients/showtime.c index af413e89..b40589fc 100644 --- a/example-clients/showtime.c +++ b/example-clients/showtime.c @@ -35,7 +35,7 @@ showtime () transport_state = jack_transport_query (client, ¤t); frame_time = jack_frame_time (client); - printf ("frame = %u frame_time = %u usecs = %lld \t", current.frame, frame_time, current.usecs); + printf ("frame = %u frame_time = %u usecs = %ld \t", current.frame, frame_time, current.usecs); switch (transport_state) { case JackTransportStopped: From 13724d824458ffaea03b2ee8399e3d6fe48071e1 Mon Sep 17 00:00:00 2001 From: sletz Date: Fri, 15 Apr 2011 09:40:06 +0000 Subject: [PATCH 05/12] Cleanup. git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@4308 0c269be4-1314-0410-8aa9-9f06e86f4224 --- common/JackFreewheelDriver.cpp | 12 ++++++------ common/JackWaitThreadedDriver.h | 2 +- common/netjack.c | 2 -- common/netjack_packet.c | 2 -- 4 files changed, 7 insertions(+), 11 deletions(-) diff --git a/common/JackFreewheelDriver.cpp b/common/JackFreewheelDriver.cpp index 2928b211..94987c44 100644 --- a/common/JackFreewheelDriver.cpp +++ b/common/JackFreewheelDriver.cpp @@ -28,12 +28,12 @@ namespace Jack int JackFreewheelDriver::Process() { - int res = 0; + int res = 0; - jack_log("JackFreewheelDriver::Process master %lld", fEngineControl->fTimeOutUsecs); - JackDriver::CycleTakeBeginTime(); + jack_log("JackFreewheelDriver::Process master %lld", fEngineControl->fTimeOutUsecs); + JackDriver::CycleTakeBeginTime(); - if (fEngine->Process(fBeginDateUst, fEndDateUst)) { + if (fEngine->Process(fBeginDateUst, fEndDateUst)) { if (fGraphManager->ResumeRefNum(&fClientControl, fSynchroTable)) { // Signal all clients jack_error("JackFreewheelDriver::Process: ResumeRefNum error"); @@ -46,10 +46,10 @@ int JackFreewheelDriver::Process() return 0; } - } else { // Graph not finished: do not activate it + } else { // Graph not finished: do not activate it jack_error("JackFreewheelDriver::Process: Process error"); res = -1; - } + } return res; } diff --git a/common/JackWaitThreadedDriver.h b/common/JackWaitThreadedDriver.h index 32263123..d885f2d4 100644 --- a/common/JackWaitThreadedDriver.h +++ b/common/JackWaitThreadedDriver.h @@ -64,7 +64,7 @@ class SERVER_EXPORT JackWaitThreadedDriver : public JackThreadedDriver // JackRunnableInterface interface bool Execute() { - // Blocks until decorated driver is started (that is when it's Init method returns). + // Blocks until decorated driver is started (that is when it's Initialize method returns). if (fDriver->Initialize()) { fRunning = true; } else { diff --git a/common/netjack.c b/common/netjack.c index 2b7eeb0d..34c32fb9 100644 --- a/common/netjack.c +++ b/common/netjack.c @@ -55,8 +55,6 @@ $Id: net_driver.c,v 1.17 2006/04/16 20:16:10 torbenh Exp $ #include #endif -#include "JackError.h" - #include "netjack.h" #include "netjack_packet.h" diff --git a/common/netjack_packet.c b/common/netjack_packet.c index 21457798..52e7c7ad 100644 --- a/common/netjack_packet.c +++ b/common/netjack_packet.c @@ -68,8 +68,6 @@ #include #endif -#include "JackError.h" - #if HAVE_CELT #include #endif From 373e264b3ec0f4185e70ee6234ee491dbc3a843d Mon Sep 17 00:00:00 2001 From: sletz Date: Fri, 15 Apr 2011 12:30:50 +0000 Subject: [PATCH 06/12] Simplified installers on Windows. git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@4309 0c269be4-1314-0410-8aa9-9f06e86f4224 --- windows/JackRouter/JackRouter.cpp | 2 +- windows/JackRouter/JackRouter.vcxproj | 2 +- windows/Setup/jack.ci | 10 ++++---- windows/Setup/jack64.ci | 23 +++++++++--------- windows/Setup/{ => src/32bits}/JackRouter.dll | Bin 29184 -> 29184 bytes windows/Setup/src/32bits/JackRouter.ini | 7 ++++++ .../64bits/JackRouter.dll} | Bin 34816 -> 34816 bytes windows/Setup/src/64bits/JackRouter.ini | 7 ++++++ 8 files changed, 33 insertions(+), 18 deletions(-) rename windows/Setup/{ => src/32bits}/JackRouter.dll (56%) create mode 100644 windows/Setup/src/32bits/JackRouter.ini rename windows/Setup/{JackRouter64.dll => src/64bits/JackRouter.dll} (59%) create mode 100644 windows/Setup/src/64bits/JackRouter.ini diff --git a/windows/JackRouter/JackRouter.cpp b/windows/JackRouter/JackRouter.cpp index c5dbc495..6245cfc7 100644 --- a/windows/JackRouter/JackRouter.cpp +++ b/windows/JackRouter/JackRouter.cpp @@ -54,7 +54,7 @@ static const double twoRaisedTo32Reciprocal = 1. / twoRaisedTo32; #include "windows.h" #include "mmsystem.h" #ifdef _WIN64 -#define JACK_ROUTER "JackRouter64.dll" +#define JACK_ROUTER "JackRouter.dll" #include #else #define JACK_ROUTER "JackRouter.dll" diff --git a/windows/JackRouter/JackRouter.vcxproj b/windows/JackRouter/JackRouter.vcxproj index bb9a751b..668ab80f 100644 --- a/windows/JackRouter/JackRouter.vcxproj +++ b/windows/JackRouter/JackRouter.vcxproj @@ -242,7 +242,7 @@ true true Windows - .\Release\JackRouter64.dll + .\x64\Release\JackRouter.dll .\Release\JackRouter64.lib odbc32.lib;odbccp32.lib;winmm.lib;%(AdditionalDependencies) .\JackRouter.def diff --git a/windows/Setup/jack.ci b/windows/Setup/jack.ci index e1dd6386..0b037e95 100644 --- a/windows/Setup/jack.ci +++ b/windows/Setup/jack.ci @@ -53,7 +53,6 @@ -<_>.\src\vcredist_2010_x86.exeinstovernewer0 <_>..\Release\bin\libjack.ainstlibovernewer0 <_>..\Release\bin\libjack.libinstlibovernewer0 <_>..\Release\bin\libjack.definstlibovernewer0 @@ -95,8 +94,10 @@ <_>..\..\common\jack\systemdeps.hinstincludes\jackovernewer1 <_>..\..\common\jack\weakjack.hinstincludes\jackovernewer1 <_>..\..\common\jack\weakmacros.hinstincludes\jackovernewer1 -<_>.\JackRouter.dllinstovernewer0 -<_>.\JackRouter.iniinstovernewer0 +<_>.\src\32bits\JackRouter.dllinst32bitsovernewer0 +<_>.\src\32bits\JackRouter.iniinst32bitsovernewer0 +<_>.\src\32bits\msvcr100.dllinst32bitsovernewer0 +<_>.\src\32bits\msvcp100.dllinst32bitsovernewer0 <_>.\qjackctl\mingwm10.dllinstovernewer0 <_>.\qjackctl\qjackctl.exeinstovernewer0 <_>.\qjackctl\QtCore4.dllinstovernewer0 @@ -107,7 +108,6 @@ - <_>appinstvcredist_2010_x86.exe1instend @@ -126,7 +126,7 @@ - <_>instJackRouter.dll + <_>inst32bits\JackRouter.dll diff --git a/windows/Setup/jack64.ci b/windows/Setup/jack64.ci index 24eaa6e9..086df7d6 100644 --- a/windows/Setup/jack64.ci +++ b/windows/Setup/jack64.ci @@ -53,8 +53,6 @@ -<_>.\src\vcredist_2010_x86.exeinstovernewer0 -<_>.\src\vcredist_2010_x64.exeinstovernewer0 <_>..\Release64\bin\libjack64.ainstlibovernewer0 <_>..\Release64\bin\libjack64.libinstlibovernewer0 <_>..\Release64\bin\libjack64.definstlibovernewer0 @@ -71,6 +69,7 @@ <_>..\Release\bin\libjackserver.libinstlibovernewer0 <_>..\Release\bin\libjackserver.definstlibovernewer0 <_>..\Release\bin\libjackserver.dllsysovernewer0 +<_>..\Release\bin\portaudio_x86.dllinstovernewer0 <_>..\Release64\bin\jack_connect.exeinstovernewer0 <_>..\Release64\bin\jack_disconnect.exeinstovernewer0 <_>..\Release64\bin\jack_load.exeinstovernewer0 @@ -81,7 +80,6 @@ <_>..\Release64\bin\jackd.exeinstovernewer0 <_>..\Release64\bin\libsamplerate_x86_64.dllinstovernewer0 <_>..\Release64\bin\portaudio_x86_64.dllinstovernewer0 -<_>..\Release\bin\portaudio_x86.dllinstovernewer0 <_>..\Release64\bin\jack\jack_net.dllinstjackovernewer0 <_>..\Release64\bin\jack\jack_netone.dllinstjackovernewer0 <_>..\Release64\bin\jack_netsource.exeinstovernewer0 @@ -105,9 +103,14 @@ <_>..\..\common\jack\systemdeps.hinstincludes\jackovernewer1 <_>..\..\common\jack\weakjack.hinstincludes\jackovernewer1 <_>..\..\common\jack\weakmacros.hinstincludes\jackovernewer1 -<_>.\JackRouter.dllinstovernewer0 -<_>.\JackRouter64.dllinstovernewer0 -<_>.\JackRouter.iniinstovernewer0 +<_>.\src\32bits\JackRouter.dllinst32bitsovernewer0 +<_>.\src\32bits\JackRouter.iniinst32bitsovernewer0 +<_>.\src\32bits\msvcr100.dllinst32bitsovernewer0 +<_>.\src\32bits\msvcp100.dllinst32bitsovernewer0 +<_>.\src\64bits\JackRouter.dllinst64bitsovernewer0 +<_>.\src\64bits\JackRouter.iniinst64bitsovernewer0 +<_>.\src\64bits\msvcr100.dllinst64bitsovernewer0 +<_>.\src\64bits\msvcp100.dllinst64bitsovernewer0 <_>.\qjackctl\mingwm10.dllinstovernewer0 <_>.\qjackctl\qjackctl.exeinstovernewer0 <_>.\qjackctl\QtCore4.dllinstovernewer0 @@ -118,9 +121,7 @@ - <_>appinstvcredist_2010_x86.exe1instend - <_>appinstvcredist_2010_x64.exe1instend - + @@ -138,8 +139,8 @@ - <_>instJackRouter.dll - <_>instJackRouter64.dll + <_>inst32bits\JackRouter.dll + <_>inst64bits\JackRouter.dll diff --git a/windows/Setup/JackRouter.dll b/windows/Setup/src/32bits/JackRouter.dll similarity index 56% rename from windows/Setup/JackRouter.dll rename to windows/Setup/src/32bits/JackRouter.dll index e4709cd30e3d76a513d980d5e0816cfe52df7cf8..b02ab70eeeb75d6b4f265f707c6e6e3bf0990304 100644 GIT binary patch delta 4273 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 delta 4342 zcmcImdsr0L6~A`{L>_Sv78aJrq9_PRW@mQZvkWLIDC&YdjIXYUxS~NCF_KgZM)5;e znwYB%Cd81ICPZn2ZXUL#Ew;3nMy;vF*hCF!v{{ohA*o4>kI*x_(5(IX^}pWl`^}wm z?z!ju?m73~ndU3F`3mke;W1asyNDSl;S3_-dkr3q)Z#gY>%rtr!$jOm{)z?sHHk7j zgEKsb4Q>P8LF~cVxRKNb_r*8XAgXd81VQuu@y_t@w*JtTzKuz)Rx%^xe!~Qw90{Ru zqvwN=U>vR6R(S8ZJ!+K*R=373!W&6hXpJG%MqUfuNR?F~%2oL9he-0rS+uNdgxo{h z`YkPAHB`8oAy`|>=HcPtTIBHF&mvUe5@AMLo33-kz-!5{@uCw^+xio0k*koDge4{? zgPr^8vfsPs-DXd*eapR(BZ`xHBVpsxLwsR<5#_h;^+z;8#FGDr_&fs2&{iQ4m54Yq6_KA8*sgOG>>p=O*5@)Qy>qwn35f>A; zk;7@^xN)%|XeCLC&BlYCIkBx6_j=C80;}|8w8C|UtTn6HLAuSkxSo7yegnTvJc*Zp z+n%JC;SA1Bw&N3?mgEQws>f4)3M$@`nsj0%qK1u+L1|jv9l!kmRI0K~HEkRI_Q7!1 z2~UHi8YkXuvP(ZY-&tHwEyef+&+JL}VuP`aG^SaZi>sir^MiK2ycACJK*ΞQj2q z;o-l2>W=JbM%1O{6#MSZWw!@HHiPBBte|T0Zra+2MIgBC*MW(vfRs+o!6Ml@c`M{( z%#?I^W=%0;n#`W^RY(RHy3)vu^hqI!{?~Qz>eEJ$ed$yE+6dC0PVfz~DB}R0>-jok zJjOf8*vv=qQO^^Z3ovZw53>fam%Nz030pkr(^ieaS4bNjhi{Xg(fN1@`H)V_9wn&r zoOv5oj=VpF3&MTcyZU|TcIcbg;f)MO$Q3~ZYch@_71o2;&`VlaZ z=lO|7r>>aSUgGkN?DLJ3k;{C&-_);gki|k$;9LjUCS(L!n8>Tbv^bxSHotf9TQYop zTR(NoNp1m)|zk)7h?0PQHF--^ir+R+t!Dke`4nCuu0 z8gWeb+vc16O9Mj9-h($FIZqedf`xw<((l|v=1VE@-)a5M%fNwS_`Iv0?2yu+9EYTN zm=8#j3C2rd9176v=kDF{m3~TMTKXEM`qSz6&`^%oLVoE);jGP!yxBG%%)p5w*i@ruwjh$<}l zKf+_3pN^Y?Y7un?NOVR)4?vusY#D^_v>~bwFbHr=fj$mVlnGH5K%WRu5tRq;PCzr@ z44`+UNAaKsGy@z7(3@c_8Bz5X(8JZM_xTHp$lD8k84RCD>S40au{J4UwLdzBe2oDl zf}9N~1Z*ZrB`G+9*h|dD>Jd9Vt-5W4ZbR-bNinwn$4EEGz2sS#*-nm^L?;afjO!7G zbQubf2q+_;gWVvBDmAByAnV@s1}6X&j@pdqA0zoCaWm@!taKjDAeRN`^x1mz!X?=e zpw~V2fP55ij=WHs5~7a=Z6)(dV`mNp80tP;r%4Q3mBafOiD^)e9mAUI(N7v5gZ}?Hvr`U zBFOQDW?W4!Ei}&>t$=Q$x4@u&4cxFmBpa$eD(hrakPAk14qqlRb(8%Lgz6U}^a8+G zhR|HVPQX#XAiz?N(30{!sj;M^jD|yes?3}^y$CkusBh?B%D7ur$++?j_%X7je1Y}M zLO+em(Caj=L9Z|II`sMm8HQe8N>~|uR-xsQJLOs9>Ole}+DfbyS@7XqR>9)UWKYF{ z1O%sFw+kKVsgd4PPHt9Y!smQ)o zeO2b94!CA@o;g~6dC`n@D>iJHwPIz%`Uf7$%R?PxPnBYzIC8ow0nD%6ZCzu+ecUBXpiNVq8kiG^aRI8|aKMRH3=r1zw&QlYnzo=4_bSzgVw)W6(*lq!>ng|m?O*s>=*0} zma#o+d(L*)mI~At^R0Xr{|Z0ApWDTEC^i}$w z^i7~uV_j$czO~c(ob_+kiOd|PhB?KQv&+~jww~R=y4n5gi|kA6W%dL14!g+~%T3~@ z@ElP41AmbxkjI}39-&`&$4Bc~@j3BulXzMj62qlYHkaJ;t78XY3XBrS^LJdHWT6Sgs|P%`MNZ%WcRVt4-4+?Llq3c3k^L1J-#6 z?S?awKu@Hz=o$1|^cbsVEw(;s{oHC{W-w0XameE_=8w!Zrs)gj4pYZI#6H3PgnffO z&j#7X+Y)T5ZMLn^)^2;+)@?g&J8QdayJItOkz6(>aMQVETorde*Ty~0JH(hE26dTrO6NwPL;aptwss0a-aGz9SAoZWu|Fa-{-kj#MhuN#9DrG9|~#Q{`N_ zNdBI@N!}{=%cteD@&)-*`KD}ErYgLmC@Yj&VY7ep(J-3Y1H?3MO|_P6aRx$|>-a!p#YmZoKD zw8m?8tw5Wrm1_5CPHnZeUfZNKX>M(=wqJWjdqF#*{aSlnJFQ*TKG3ddpXud*o3RvC4vZY38v(zkYms+LW(q5@Y>XlAN dC#5TrS3*$a7&%SOkVRRQ3*@Dq)$8{e{sjnFZw~+f diff --git a/windows/Setup/src/32bits/JackRouter.ini b/windows/Setup/src/32bits/JackRouter.ini new file mode 100644 index 00000000..8a62b6a7 --- /dev/null +++ b/windows/Setup/src/32bits/JackRouter.ini @@ -0,0 +1,7 @@ +[IO] +input=4 +output=4 + +[AUTO_CONNECT] +input=1 +output=1 diff --git a/windows/Setup/JackRouter64.dll b/windows/Setup/src/64bits/JackRouter.dll similarity index 59% rename from windows/Setup/JackRouter64.dll rename to windows/Setup/src/64bits/JackRouter.dll index 543820d4da9665ec71d70e18d83a3a4cdb1882b4..799d063dd3e0cd71f8b85a26aa6152ff042ed0ce 100644 GIT binary patch delta 5642 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 delta 5653 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 Dp_ Date: Fri, 15 Apr 2011 14:14:11 +0000 Subject: [PATCH 07/12] JackWeakAPI.cpp updated for 64bits. git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@4310 0c269be4-1314-0410-8aa9-9f06e86f4224 --- common/JackWeakAPI.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/common/JackWeakAPI.cpp b/common/JackWeakAPI.cpp index 146de360..18c791b2 100644 --- a/common/JackWeakAPI.cpp +++ b/common/JackWeakAPI.cpp @@ -57,7 +57,11 @@ static void __attribute__((constructor)) tryload_libjack() #ifdef __APPLE__ libjack_handle = dlopen("libjack.0.dylib", RTLD_LAZY); #elif defined(WIN32) - libjack_handle = LoadLibrary("libjack.dll"); + #ifdef _WIN64 + libjack_handle = LoadLibrary("libjack64.dll"); + #else + libjack_handle = LoadLibrary("libjack.dll"); + #endif #else libjack_handle = dlopen("libjack.so.0", RTLD_LAZY); #endif From fd4fd01765d0378f6968ab237e9ea16aa1b8e584 Mon Sep 17 00:00:00 2001 From: sletz Date: Fri, 15 Apr 2011 15:41:17 +0000 Subject: [PATCH 08/12] Correct jackdmp.cpp. git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@4311 0c269be4-1314-0410-8aa9-9f06e86f4224 --- common/Jackdmp.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/common/Jackdmp.cpp b/common/Jackdmp.cpp index f2edfe5b..33b3abcd 100644 --- a/common/Jackdmp.cpp +++ b/common/Jackdmp.cpp @@ -540,12 +540,15 @@ int main(int argc, char* argv[]) // Slave drivers for (it = slaves_list.begin(); it != slaves_list.end(); it++) { jackctl_driver_t * slave_driver_ctl = jackctl_server_get_driver(server_ctl, *it); - jackctl_server_remove_slave(server_ctl, slave_driver_ctl); + if (slave_driver_ctl) + jackctl_server_remove_slave(server_ctl, slave_driver_ctl); } + // Internal clients for (it = internals_list.begin(); it != internals_list.end(); it++) { jackctl_internal_t * internal_driver_ctl = jackctl_server_get_internal(server_ctl, *it); - jackctl_server_unload_internal(server_ctl, internal_driver_ctl); + if (internal_driver_ctl) + jackctl_server_unload_internal(server_ctl, internal_driver_ctl); } jackctl_server_close(server_ctl); destroy_server: From 8a845aa02a6b7340d6201a31de219a5256bb086f Mon Sep 17 00:00:00 2001 From: nedko Date: Sun, 17 Apr 2011 13:58:05 +0000 Subject: [PATCH 09/12] jackdbus: Don't emit ServerStopped signal on SwitchMaster git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@4313 0c269be4-1314-0410-8aa9-9f06e86f4224 --- dbus/controller_iface_control.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/dbus/controller_iface_control.c b/dbus/controller_iface_control.c index 53daba7e..d38df3c6 100644 --- a/dbus/controller_iface_control.c +++ b/dbus/controller_iface_control.c @@ -127,8 +127,6 @@ jack_control_run_method( assert(call->reply != NULL); return true; } - - jack_controller_control_send_signal_server_stopped(); } else if (strcmp (call->method_name, "GetLoad") == 0) { From 4b9b621a31a5ffdd153f48a0d2b6c78ca4d314ea Mon Sep 17 00:00:00 2001 From: nedko Date: Sun, 17 Apr 2011 14:08:35 +0000 Subject: [PATCH 10/12] jackdbus: remove the libxml backend It was be problematic in past (FFADO uses libxml as well). Most systems will have both libxml and expat. Maintaining two backends is waste of effort. If needed, the libxml backend can be resurrected. git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@4314 0c269be4-1314-0410-8aa9-9f06e86f4224 --- dbus/wscript | 1 - dbus/xml_libxml.c | 797 ---------------------------------------------- 2 files changed, 798 deletions(-) delete mode 100644 dbus/xml_libxml.c diff --git a/dbus/wscript b/dbus/wscript index a4066b57..6aa716d2 100644 --- a/dbus/wscript +++ b/dbus/wscript @@ -59,7 +59,6 @@ def build(bld): 'controller_iface_transport.c', 'xml.c', 'xml_expat.c', - #'xml_libxml.c', #'xml_nop.c', 'xml_write_raw.c', 'sigsegv.c', diff --git a/dbus/xml_libxml.c b/dbus/xml_libxml.c deleted file mode 100644 index 8644182d..00000000 --- a/dbus/xml_libxml.c +++ /dev/null @@ -1,797 +0,0 @@ -/* -*- Mode: C ; c-basic-offset: 4 -*- */ -/* - Copyright (C) 2007,2008 Nedko Arnaudov - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - -*/ - -#if defined(HAVE_CONFIG_H) -#include "config.h" -#endif - -#include -#include -#include - -#include -#include -#include - -#include -#include -#include "controller_internal.h" -#include "dbus.h" - -/* XPath expression used for engine options selection */ -#define XPATH_ENGINE_OPTIONS_EXPRESSION "/jack/engine/option" - -/* XPath expression used for drivers selection */ -#define XPATH_DRIVERS_EXPRESSION "/jack/drivers/driver" - -/* XPath expression used for driver options selection */ -#define XPATH_DRIVER_OPTIONS_EXPRESSION "/jack/drivers/driver[@name = '%s']/option" - -bool -jack_controller_settings_init() -{ - /* - * this initialize the library and check potential ABI mismatches - * between the version it was compiled for and the actual shared - * library used. - */ - LIBXML_TEST_VERSION; - - return true; -} - -void -jack_controller_settings_uninit() -{ -} - -#define writer ((xmlTextWriterPtr)context) - -bool -jack_controller_settings_write_option( - void *context, - const char *name, - const char *content, - void *dbus_call_context_ptr) -{ - if (xmlTextWriterStartElement(writer, BAD_CAST "option") == -1) - { - jack_dbus_error(dbus_call_context_ptr, JACK_DBUS_ERROR_GENERIC, "xmlTextWriterStartElement() failed."); - return false; - } - - if (xmlTextWriterWriteAttribute(writer, BAD_CAST "name", BAD_CAST name) == -1) - { - jack_dbus_error(dbus_call_context_ptr, JACK_DBUS_ERROR_GENERIC, "xmlTextWriterWriteAttribute() failed."); - return false; - } - - if (xmlTextWriterWriteString(writer, BAD_CAST content) == -1) - { - jack_dbus_error(dbus_call_context_ptr, JACK_DBUS_ERROR_GENERIC, "xmlTextWriterWriteString() failed."); - return false; - } - - if (xmlTextWriterEndElement(writer) == -1) - { - jack_dbus_error(dbus_call_context_ptr, JACK_DBUS_ERROR_GENERIC, "xmlTextWriterEndElement() failed."); - return false; - } - - return true; -} - -#undef writer - -bool -jack_controller_settings_write_engine( - struct jack_controller * controller_ptr, - xmlTextWriterPtr writer, - void *dbus_call_context_ptr) -{ -/* jack_info("engine settings begin"); */ - -/* if (xmlTextWriterWriteComment(writer, BAD_CAST "engine parameters") == -1) */ -/* { */ -/* jack_dbus_error(dbus_call_context_ptr, JACK_DBUS_ERROR_GENERIC, "xmlTextWriterWriteComment() failed."); */ -/* return false; */ -/* } */ - - if (xmlTextWriterStartElement(writer, BAD_CAST "engine") == -1) - { - jack_dbus_error(dbus_call_context_ptr, JACK_DBUS_ERROR_GENERIC, "xmlTextWriterStartElement() failed."); - return false; - } - - if (!jack_controller_settings_save_engine_options(writer, controller_ptr, dbus_call_context_ptr)) - { - return false; - } - - if (xmlTextWriterEndElement(writer) == -1) - { - jack_dbus_error(dbus_call_context_ptr, JACK_DBUS_ERROR_GENERIC, "xmlTextWriterEndElement() failed."); - return false; - } - -/* jack_info("engine settings end"); */ - return true; -} - -bool -jack_controller_settings_write_driver( - struct jack_controller * controller_ptr, - xmlTextWriterPtr writer, - jackctl_driver driver, - void *dbus_call_context_ptr) -{ -/* if (xmlTextWriterWriteComment(writer, BAD_CAST "driver parameters") == -1) */ -/* { */ -/* jack_dbus_error(dbus_call_context_ptr, JACK_DBUS_ERROR_GENERIC, "xmlTextWriterWriteComment() failed."); */ -/* return false; */ -/* } */ - - if (xmlTextWriterStartElement(writer, BAD_CAST "driver") == -1) - { - jack_dbus_error(dbus_call_context_ptr, JACK_DBUS_ERROR_GENERIC, "xmlTextWriterStartElement() failed."); - return false; - } - - if (xmlTextWriterWriteAttribute(writer, BAD_CAST "name", BAD_CAST jackctl_driver_get_name(driver)) == -1) - { - jack_dbus_error(dbus_call_context_ptr, JACK_DBUS_ERROR_GENERIC, "xmlTextWriterWriteAttribute() failed."); - return false; - } - - if (!jack_controller_settings_save_driver_options(writer, driver, dbus_call_context_ptr)) - { - return false; - } - - if (xmlTextWriterEndElement(writer) == -1) - { - jack_dbus_error(dbus_call_context_ptr, JACK_DBUS_ERROR_GENERIC, "xmlTextWriterEndElement() failed."); - return false; - } - - return true; -} - -bool -jack_controller_settings_write_drivers( - struct jack_controller * controller_ptr, - xmlTextWriterPtr writer, - void *dbus_call_context_ptr) -{ - const JSList * node_ptr; - jackctl_driver driver; - - if (xmlTextWriterStartElement(writer, BAD_CAST "drivers") == -1) - { - jack_dbus_error(dbus_call_context_ptr, JACK_DBUS_ERROR_GENERIC, "xmlTextWriterStartElement() failed."); - return false; - } - - node_ptr = jackctl_server_get_drivers_list(controller_ptr->server); - - while (node_ptr != NULL) - { - driver = (jackctl_driver)node_ptr->data; - - if (!jack_controller_settings_write_driver( - controller_ptr, - writer, - driver, - dbus_call_context_ptr)) - { - return false; - } - - node_ptr = jack_slist_next(node_ptr); - } - - if (xmlTextWriterEndElement(writer) == -1) - { - jack_dbus_error(dbus_call_context_ptr, JACK_DBUS_ERROR_GENERIC, "xmlTextWriterEndElement() failed."); - return false; - } - - return true; -} - -bool -jack_controller_settings_write_internal( - struct jack_controller * controller_ptr, - xmlTextWriterPtr writer, - jackctl_internal internal, - void *dbus_call_context_ptr) -{ -/* if (xmlTextWriterWriteComment(writer, BAD_CAST "driver parameters") == -1) */ -/* { */ -/* jack_dbus_error(dbus_call_context_ptr, JACK_DBUS_ERROR_GENERIC, "xmlTextWriterWriteComment() failed."); */ -/* return false; */ -/* } */ - - if (xmlTextWriterStartElement(writer, BAD_CAST "internal") == -1) - { - jack_dbus_error(dbus_call_context_ptr, JACK_DBUS_ERROR_GENERIC, "xmlTextWriterStartElement() failed."); - return false; - } - - if (xmlTextWriterWriteAttribute(writer, BAD_CAST "name", BAD_CAST jackctl_internal_get_name(driver)) == -1) - { - jack_dbus_error(dbus_call_context_ptr, JACK_DBUS_ERROR_GENERIC, "xmlTextWriterWriteAttribute() failed."); - return false; - } - - if (!jack_controller_settings_save_internal_options(writer, internal, dbus_call_context_ptr)) - { - return false; - } - - if (xmlTextWriterEndElement(writer) == -1) - { - jack_dbus_error(dbus_call_context_ptr, JACK_DBUS_ERROR_GENERIC, "xmlTextWriterEndElement() failed."); - return false; - } - - return true; -} - -bool -jack_controller_settings_write_internals( - struct jack_controller * controller_ptr, - xmlTextWriterPtr writer, - void *dbus_call_context_ptr) -{ - const JSList * node_ptr; - jackctl_driver internal; - - if (xmlTextWriterStartElement(writer, BAD_CAST "internals") == -1) - { - jack_dbus_error(dbus_call_context_ptr, JACK_DBUS_ERROR_GENERIC, "xmlTextWriterStartElement() failed."); - return false; - } - - node_ptr = jackctl_server_get_internals_list(controller_ptr->server); - - while (node_ptr != NULL) - { - internal = (jackctl_internal)node_ptr->data; - - if (!jack_controller_settings_write_internal( - controller_ptr, - writer, - internal, - dbus_call_context_ptr)) - { - return false; - } - - node_ptr = jack_slist_next(node_ptr); - } - - if (xmlTextWriterEndElement(writer) == -1) - { - jack_dbus_error(dbus_call_context_ptr, JACK_DBUS_ERROR_GENERIC, "xmlTextWriterEndElement() failed."); - return false; - } - - return true; -} - -bool -jack_controller_settings_save( - struct jack_controller * controller_ptr, - void *dbus_call_context_ptr) -{ - xmlTextWriterPtr writer; - char *filename; - size_t conf_len; - bool ret; - time_t timestamp; - char timestamp_str[28]; - - time(×tamp); - timestamp_str[0] = ' '; - ctime_r(×tamp, timestamp_str + 1); - timestamp_str[25] = ' '; - - ret = false; - - conf_len = strlen(JACKDBUS_CONF); - - filename = malloc(g_jackdbus_dir_len + conf_len + 1); - if (filename == NULL) - { - jack_error("Out of memory."); - goto fail; - } - - memcpy(filename, g_jackdbus_dir, g_jackdbus_dir_len); - memcpy(filename + g_jackdbus_dir_len, JACKDBUS_CONF, conf_len); - filename[g_jackdbus_dir_len + conf_len] = 0; - - jack_info("saving settings to \"%s\"", filename); - - writer = xmlNewTextWriterFilename(filename, 0); - if (writer == NULL) - { - jack_dbus_error(dbus_call_context_ptr, JACK_DBUS_ERROR_GENERIC, "Error creating the xml writer."); - goto fail_free_filename; - } - - if (xmlTextWriterSetIndent(writer, 1) == -1) - { - jack_dbus_error(dbus_call_context_ptr, JACK_DBUS_ERROR_GENERIC, "xmlTextWriterSetIndent() failed."); - goto fail_free_writter; - } - - if (xmlTextWriterStartDocument(writer, NULL, NULL, NULL) == -1) - { - jack_dbus_error(dbus_call_context_ptr, JACK_DBUS_ERROR_GENERIC, "xmlTextWriterStartDocument() failed."); - goto fail_free_writter; - } - - if (xmlTextWriterWriteComment(writer, BAD_CAST "\n" JACK_CONF_HEADER_TEXT) == -1) - { - jack_dbus_error(dbus_call_context_ptr, JACK_DBUS_ERROR_GENERIC, "xmlTextWriterWriteComment() failed."); - goto fail_free_writter; - } - - if (xmlTextWriterWriteComment(writer, BAD_CAST timestamp_str) == -1) - { - jack_dbus_error(dbus_call_context_ptr, JACK_DBUS_ERROR_GENERIC, "xmlTextWriterWriteComment() failed."); - goto fail_free_writter; - } - - if (xmlTextWriterStartElement(writer, BAD_CAST "jack") == -1) - { - jack_dbus_error(dbus_call_context_ptr, JACK_DBUS_ERROR_GENERIC, "xmlTextWriterStartElement() failed."); - goto fail_free_writter; - } - - if (!jack_controller_settings_write_engine(controller_ptr, writer, dbus_call_context_ptr)) - { - goto fail_free_writter; - } - - if (!jack_controller_settings_write_drivers(controller_ptr, writer, dbus_call_context_ptr)) - { - goto fail_free_writter; - } - - if (!jack_controller_settings_write_internals(controller_ptr, writer, dbus_call_context_ptr)) - { - goto fail_free_writter; - } - - if (xmlTextWriterEndElement(writer) == -1) - { - jack_dbus_error(dbus_call_context_ptr, JACK_DBUS_ERROR_GENERIC, "xmlTextWriterStartElement() failed."); - goto fail_free_writter; - } - - if (xmlTextWriterEndDocument(writer) == -1) - { - jack_dbus_error(dbus_call_context_ptr, JACK_DBUS_ERROR_GENERIC, "xmlTextWriterEndDocument() failed."); - goto fail_free_writter; - } - - ret = true; - -fail_free_writter: - xmlFreeTextWriter(writer); - -fail_free_filename: - free(filename); - -fail: - return ret; -} - -void -jack_controller_settings_read_engine( - struct jack_controller * controller_ptr, - xmlXPathContextPtr xpath_ctx_ptr) -{ - xmlXPathObjectPtr xpath_obj_ptr; - xmlBufferPtr content_buffer_ptr; - int i; - const char *option_name; - const char *option_value; - - /* Evaluate xpath expression */ - xpath_obj_ptr = xmlXPathEvalExpression((const xmlChar *)XPATH_ENGINE_OPTIONS_EXPRESSION, xpath_ctx_ptr); - if (xpath_obj_ptr == NULL) - { - jack_error("Unable to evaluate XPath expression \"%s\"", XPATH_ENGINE_OPTIONS_EXPRESSION); - goto exit; - } - - if (xpath_obj_ptr->nodesetval == NULL || xpath_obj_ptr->nodesetval->nodeNr == 0) - { - jack_error("XPath \"%s\" evaluation returned no data", XPATH_ENGINE_OPTIONS_EXPRESSION); - goto free_xpath_obj; - } - - content_buffer_ptr = xmlBufferCreate(); - if (content_buffer_ptr == NULL) - { - jack_error("xmlBufferCreate() failed."); - goto free_xpath_obj; - } - - for (i = 0 ; i < xpath_obj_ptr->nodesetval->nodeNr ; i++) - { - //jack_info("engine option \"%s\" at index %d", xmlGetProp(xpath_obj_ptr->nodesetval->nodeTab[i], BAD_CAST "name"), i); - - if (xmlNodeBufGetContent(content_buffer_ptr, xpath_obj_ptr->nodesetval->nodeTab[i]) == -1) - { - jack_error("xmlNodeBufGetContent() failed."); - goto next_option; - } - - option_name = (const char *)xmlGetProp(xpath_obj_ptr->nodesetval->nodeTab[i], BAD_CAST "name"); - option_value = (const char *)xmlBufferContent(content_buffer_ptr); - - jack_controller_settings_set_engine_option(controller_ptr, option_name, option_value); - - next_option: - xmlBufferEmpty(content_buffer_ptr); - } - -//free_buffer: - xmlBufferFree(content_buffer_ptr); - -free_xpath_obj: - xmlXPathFreeObject(xpath_obj_ptr); - -exit: - return; -} - -void -jack_controller_settings_read_driver( - struct jack_controller * controller_ptr, - xmlXPathContextPtr xpath_ctx_ptr, - jackctl_driver driver) -{ - char *xpath; - size_t xpath_len; - xmlXPathObjectPtr xpath_obj_ptr; - xmlBufferPtr content_buffer_ptr; - int i; - const char *option_name; - const char *option_value; - const char *driver_name; - - driver_name = jackctl_driver_get_name(driver); - - jack_info("reading options for driver \"%s\"", driver_name); - - xpath_len = snprintf(NULL, 0, XPATH_DRIVER_OPTIONS_EXPRESSION, driver_name); - - xpath = malloc(xpath_len); - if (xpath == NULL) - { - jack_error("Out of memory."); - goto exit; - } - - snprintf(xpath, xpath_len, XPATH_DRIVER_OPTIONS_EXPRESSION, driver_name); - - //jack_info("xpath = \"%s\"", xpath); - - /* Evaluate xpath expression */ - xpath_obj_ptr = xmlXPathEvalExpression((const xmlChar *)xpath, xpath_ctx_ptr); - if (xpath_obj_ptr == NULL) - { - jack_error("Unable to evaluate XPath expression \"%s\"", xpath); - goto free_xpath; - } - - if (xpath_obj_ptr->nodesetval == NULL || xpath_obj_ptr->nodesetval->nodeNr == 0) - { - //jack_info("XPath \"%s\" evaluation returned no data", xpath); - goto free_xpath_obj; - } - - content_buffer_ptr = xmlBufferCreate(); - if (content_buffer_ptr == NULL) - { - jack_error("xmlBufferCreate() failed."); - goto free_xpath_obj; - } - - for (i = 0 ; i < xpath_obj_ptr->nodesetval->nodeNr ; i++) - { - //jack_info("driver option \"%s\" at index %d", xmlGetProp(xpath_obj_ptr->nodesetval->nodeTab[i], BAD_CAST "name"), i); - - if (xmlNodeBufGetContent(content_buffer_ptr, xpath_obj_ptr->nodesetval->nodeTab[i]) == -1) - { - jack_error("xmlNodeBufGetContent() failed."); - goto next_option; - } - - option_name = (const char *)xmlGetProp(xpath_obj_ptr->nodesetval->nodeTab[i], BAD_CAST "name"); - option_value = (const char *)xmlBufferContent(content_buffer_ptr); - - jack_controller_settings_set_driver_option(driver, option_name, option_value); - - next_option: - xmlBufferEmpty(content_buffer_ptr); - } - -//free_buffer: - xmlBufferFree(content_buffer_ptr); - -free_xpath_obj: - xmlXPathFreeObject(xpath_obj_ptr); - -free_xpath: - free(xpath); - -exit: - return; -} - -void -jack_controller_settings_read_internal( - struct jack_controller * controller_ptr, - xmlXPathContextPtr xpath_ctx_ptr, - jackctl_internal internal) -{ - char *xpath; - size_t xpath_len; - xmlXPathObjectPtr xpath_obj_ptr; - xmlBufferPtr content_buffer_ptr; - int i; - const char *option_name; - const char *option_value; - const char *internal_name; - - internal_name = jackctl_internal_get_name(internal); - - jack_info("reading options for internal \"%s\"", internal_name); - - xpath_len = snprintf(NULL, 0, XPATH_DRIVER_OPTIONS_EXPRESSION, internal_name); - - xpath = malloc(xpath_len); - if (xpath == NULL) - { - jack_error("Out of memory."); - goto exit; - } - - snprintf(xpath, xpath_len, XPATH_DRIVER_OPTIONS_EXPRESSION, internal_name); - - //jack_info("xpath = \"%s\"", xpath); - - /* Evaluate xpath expression */ - xpath_obj_ptr = xmlXPathEvalExpression((const xmlChar *)xpath, xpath_ctx_ptr); - if (xpath_obj_ptr == NULL) - { - jack_error("Unable to evaluate XPath expression \"%s\"", xpath); - goto free_xpath; - } - - if (xpath_obj_ptr->nodesetval == NULL || xpath_obj_ptr->nodesetval->nodeNr == 0) - { - //jack_info("XPath \"%s\" evaluation returned no data", xpath); - goto free_xpath_obj; - } - - content_buffer_ptr = xmlBufferCreate(); - if (content_buffer_ptr == NULL) - { - jack_error("xmlBufferCreate() failed."); - goto free_xpath_obj; - } - - for (i = 0 ; i < xpath_obj_ptr->nodesetval->nodeNr ; i++) - { - //jack_info("driver option \"%s\" at index %d", xmlGetProp(xpath_obj_ptr->nodesetval->nodeTab[i], BAD_CAST "name"), i); - - if (xmlNodeBufGetContent(content_buffer_ptr, xpath_obj_ptr->nodesetval->nodeTab[i]) == -1) - { - jack_error("xmlNodeBufGetContent() failed."); - goto next_option; - } - - option_name = (const char *)xmlGetProp(xpath_obj_ptr->nodesetval->nodeTab[i], BAD_CAST "name"); - option_value = (const char *)xmlBufferContent(content_buffer_ptr); - - jack_controller_settings_set_internal_option(internal, option_name, option_value); - - next_option: - xmlBufferEmpty(content_buffer_ptr); - } - -//free_buffer: - xmlBufferFree(content_buffer_ptr); - -free_xpath_obj: - xmlXPathFreeObject(xpath_obj_ptr); - -free_xpath: - free(xpath); - -exit: - return; -} - -void -jack_controller_settings_read_drivers( - struct jack_controller * controller_ptr, - xmlXPathContextPtr xpath_ctx_ptr) -{ - xmlXPathObjectPtr xpath_obj_ptr; - int i; - const char *driver_name; - jackctl_driver driver; - - /* Evaluate xpath expression */ - xpath_obj_ptr = xmlXPathEvalExpression((const xmlChar *)XPATH_DRIVERS_EXPRESSION, xpath_ctx_ptr); - if (xpath_obj_ptr == NULL) - { - jack_error("Unable to evaluate XPath expression \"%s\"", XPATH_DRIVERS_EXPRESSION); - goto exit; - } - - if (xpath_obj_ptr->nodesetval == NULL || xpath_obj_ptr->nodesetval->nodeNr == 0) - { - jack_error("XPath \"%s\" evaluation returned no data", XPATH_DRIVERS_EXPRESSION); - goto free_xpath_obj; - } - - for (i = 0 ; i < xpath_obj_ptr->nodesetval->nodeNr ; i++) - { - driver_name = (const char *)xmlGetProp(xpath_obj_ptr->nodesetval->nodeTab[i], BAD_CAST "name"); - - driver = jack_controller_find_driver(controller_ptr->server, driver_name); - if (driver == NULL) - { - jack_error("ignoring settings for unknown driver \"%s\"", driver_name); - } - else - { - jack_info("setting for driver \"%s\" found", driver_name); - - jack_controller_settings_read_driver(controller_ptr, xpath_ctx_ptr, driver); - } - } - -free_xpath_obj: - xmlXPathFreeObject(xpath_obj_ptr); - -exit: - return; -} - -void -jack_controller_settings_read_internals( - struct jack_controller * controller_ptr, - xmlXPathContextPtr xpath_ctx_ptr) -{ - xmlXPathObjectPtr xpath_obj_ptr; - int i; - const char *internal_name; - jackctl_internal internal; - - /* Evaluate xpath expression */ - xpath_obj_ptr = xmlXPathEvalExpression((const xmlChar *)XPATH_DRIVERS_EXPRESSION, xpath_ctx_ptr); - if (xpath_obj_ptr == NULL) - { - jack_error("Unable to evaluate XPath expression \"%s\"", XPATH_DRIVERS_EXPRESSION); - goto exit; - } - - if (xpath_obj_ptr->nodesetval == NULL || xpath_obj_ptr->nodesetval->nodeNr == 0) - { - jack_error("XPath \"%s\" evaluation returned no data", XPATH_DRIVERS_EXPRESSION); - goto free_xpath_obj; - } - - for (i = 0 ; i < xpath_obj_ptr->nodesetval->nodeNr ; i++) - { - internal_name = (const char *)xmlGetProp(xpath_obj_ptr->nodesetval->nodeTab[i], BAD_CAST "name"); - - driver = jack_controller_find_internal(controller_ptr->server, driver_name); - if (driver == NULL) - { - jack_error("ignoring settings for unknown internal \"%s\"", internal_name); - } - else - { - jack_info("setting for internal \"%s\" found", internal_name); - - jack_controller_settings_read_internal(controller_ptr, xpath_ctx_ptr, driver); - } - } - -free_xpath_obj: - xmlXPathFreeObject(xpath_obj_ptr); - -exit: - return; -} - - -void -jack_controller_settings_load( - struct jack_controller * controller_ptr) -{ - char *filename; - size_t conf_len; - xmlDocPtr doc_ptr; - xmlXPathContextPtr xpath_ctx_ptr; - - conf_len = strlen(JACKDBUS_CONF); - - filename = malloc(g_jackdbus_dir_len + conf_len + 1); - if (filename == NULL) - { - jack_error("Out of memory."); - goto exit; - } - - memcpy(filename, g_jackdbus_dir, g_jackdbus_dir_len); - memcpy(filename + g_jackdbus_dir_len, JACKDBUS_CONF, conf_len); - filename[g_jackdbus_dir_len + conf_len] = 0; - - jack_info("loading settings from \"%s\"", filename); - - doc_ptr = xmlParseFile(filename); - if (doc_ptr == NULL) - { - jack_error("Failed to parse \"%s\"", filename); - goto free_filename; - } - - /* Create xpath evaluation context */ - xpath_ctx_ptr = xmlXPathNewContext(doc_ptr); - if (xpath_ctx_ptr == NULL) - { - jack_error("Unable to create new XPath context"); - goto free_doc; - } - - jack_controller_settings_read_engine(controller_ptr, xpath_ctx_ptr); - jack_controller_settings_read_drivers(controller_ptr, xpath_ctx_ptr); - jack_controller_settings_read_internals(controller_ptr, xpath_ctx_ptr); - - xmlXPathFreeContext(xpath_ctx_ptr); - -free_doc: - xmlFreeDoc(doc_ptr); - -free_filename: - free(filename); - -exit: - return; -} - -void -jack_controller_settings_save_auto( - struct jack_controller * controller_ptr) -{ - jack_controller_settings_save(controller_ptr, NULL); -} From 343a0e80693d4e59b507a9e0b3882dacfb5ca450 Mon Sep 17 00:00:00 2001 From: nedko Date: Sun, 17 Apr 2011 18:18:32 +0000 Subject: [PATCH 11/12] jackdbus: params store This changeset removes code duplication that was caused by lack of unified access to parameters in the control API. Adding new virtual parameters should be much easier now. git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@4315 0c269be4-1314-0410-8aa9-9f06e86f4224 --- dbus/controller.c | 89 +- dbus/controller_iface_configure.c | 1575 ++++------------------------- dbus/controller_internal.h | 58 +- dbus/params.c | 717 +++++++++++++ dbus/params.h | 110 ++ dbus/wscript | 1 + dbus/xml.c | 376 ++----- dbus/xml_expat.c | 166 ++- dbus/xml_write_raw.c | 162 ++- 9 files changed, 1250 insertions(+), 2004 deletions(-) create mode 100644 dbus/params.c create mode 100644 dbus/params.h diff --git a/dbus/controller.c b/dbus/controller.c index e0abd258..15afe65a 100644 --- a/dbus/controller.c +++ b/dbus/controller.c @@ -1,6 +1,6 @@ /* -*- Mode: C ; c-basic-offset: 4 -*- */ /* - Copyright (C) 2007,2008,2010 Nedko Arnaudov + Copyright (C) 2007,2008,2010,2011 Nedko Arnaudov Copyright (C) 2007-2008 Juuso Alasuutari This program is free software; you can redistribute it and/or modify @@ -159,19 +159,13 @@ jack_controller_select_driver( struct jack_controller * controller_ptr, const char * driver_name) { - jackctl_driver_t *driver; - - driver = jack_controller_find_driver(controller_ptr->server, driver_name); - if (driver == NULL) + if (!jack_params_set_driver(controller_ptr->params, driver_name)) { return false; } jack_info("driver \"%s\" selected", driver_name); - controller_ptr->driver = driver; - controller_ptr->driver_set = true; - return true; } @@ -195,17 +189,11 @@ jack_controller_start_server( assert(!controller_ptr->started); /* should be ensured by caller */ - if (controller_ptr->driver == NULL) - { - jack_dbus_error(dbus_call_context_ptr, JACK_DBUS_ERROR_GENERIC, "Select driver first!"); - goto fail; - } - controller_ptr->xruns = 0; if (!jackctl_server_open( controller_ptr->server, - controller_ptr->driver)) + jack_params_get_driver(controller_ptr->params))) { jack_dbus_error(dbus_call_context_ptr, JACK_DBUS_ERROR_GENERIC, "Failed to open server"); goto fail; @@ -337,12 +325,13 @@ jack_controller_switch_master( { if (!jackctl_server_switch_master( controller_ptr->server, - controller_ptr->driver)) + jack_params_get_driver(controller_ptr->params))) { jack_dbus_error(dbus_call_context_ptr, JACK_DBUS_ERROR_GENERIC, "Failed to switch master"); return FALSE; } + return TRUE; } @@ -413,11 +402,6 @@ jack_controller_create( DBusConnection *connection) { struct jack_controller *controller_ptr; - const JSList * node_ptr; - const char ** driver_name_target; - const char ** internal_name_target; - JSList * drivers; - JSList * internals; DBusObjectPathVTable vtable = { jack_dbus_message_handler_unregister, @@ -439,54 +423,16 @@ jack_controller_create( goto fail_free; } - controller_ptr->client = NULL; - controller_ptr->started = false; - controller_ptr->driver = NULL; - controller_ptr->driver_set = false; - INIT_LIST_HEAD(&controller_ptr->slave_drivers); - - drivers = (JSList *)jackctl_server_get_drivers_list(controller_ptr->server); - controller_ptr->drivers_count = jack_slist_length(drivers); - controller_ptr->driver_names = malloc(controller_ptr->drivers_count * sizeof(const char *)); - if (controller_ptr->driver_names == NULL) + controller_ptr->params = jack_params_create(controller_ptr->server); + if (controller_ptr->params == NULL) { - jack_error("Ran out of memory trying to allocate driver names array"); + jack_error("Failed to initialize parameter tree"); goto fail_destroy_server; } - driver_name_target = controller_ptr->driver_names; - node_ptr = jackctl_server_get_drivers_list(controller_ptr->server); - while (node_ptr != NULL) - { - *driver_name_target = jackctl_driver_get_name((jackctl_driver_t *)node_ptr->data); - - /* select default driver */ - if (controller_ptr->driver == NULL && strcmp(*driver_name_target, DEFAULT_DRIVER) == 0) - { - controller_ptr->driver = (jackctl_driver_t *)node_ptr->data; - } - - node_ptr = jack_slist_next(node_ptr); - driver_name_target++; - } - - internals = (JSList *)jackctl_server_get_internals_list(controller_ptr->server); - controller_ptr->internals_count = jack_slist_length(internals); - controller_ptr->internal_names = malloc(controller_ptr->internals_count * sizeof(const char *)); - if (controller_ptr->internal_names == NULL) - { - jack_error("Ran out of memory trying to allocate internals names array"); - goto fail_free_driver_names_array; - } - - internal_name_target = controller_ptr->internal_names; - node_ptr = jackctl_server_get_internals_list(controller_ptr->server); - while (node_ptr != NULL) - { - *internal_name_target = jackctl_internal_get_name((jackctl_internal_t *)node_ptr->data); - node_ptr = jack_slist_next(node_ptr); - internal_name_target++; - } + controller_ptr->client = NULL; + controller_ptr->started = false; + INIT_LIST_HEAD(&controller_ptr->slave_drivers); controller_ptr->dbus_descriptor.context = controller_ptr; controller_ptr->dbus_descriptor.interfaces = g_jackcontroller_interfaces; @@ -498,18 +444,15 @@ jack_controller_create( &controller_ptr->dbus_descriptor)) { jack_error("Ran out of memory trying to register D-Bus object path"); - goto fail_free_internal_names_array; + goto fail_destroy_params; } jack_controller_settings_load(controller_ptr); return controller_ptr; -fail_free_internal_names_array: - free(controller_ptr->internal_names); - -fail_free_driver_names_array: - free(controller_ptr->driver_names); +fail_destroy_params: + jack_params_destroy(controller_ptr->params); fail_destroy_server: jackctl_server_destroy(controller_ptr->server); @@ -623,9 +566,7 @@ jack_controller_destroy( jack_controller_stop_server(controller_ptr, NULL); } - free(controller_ptr->driver_names); - free(controller_ptr->internal_names); - + jack_params_destroy(controller_ptr->params); jackctl_server_destroy(controller_ptr->server); free(controller_ptr); diff --git a/dbus/controller_iface_configure.c b/dbus/controller_iface_configure.c index f4b6d46f..7e3a8fd9 100644 --- a/dbus/controller_iface_configure.c +++ b/dbus/controller_iface_configure.c @@ -1,6 +1,6 @@ /* -*- Mode: C ; c-basic-offset: 4 -*- */ /* - Copyright (C) 2007,2008 Nedko Arnaudov + Copyright (C) 2007,2008,2011 Nedko Arnaudov Copyright (C) 2007-2008 Juuso Alasuutari This program is free software; you can redistribute it and/or modify @@ -31,24 +31,6 @@ #include "controller_internal.h" #include "xml.h" -#define PTNODE_ENGINE "engine" -#define PTNODE_DRIVER "driver" -#define PTNODE_DRIVERS "drivers" -#define PTNODE_INTERNALS "internals" - -#define ENGINE_DRIVER_PARAMETER_NAME "driver" -#define ENGINE_DRIVER_PARAMETER_TYPE JackParamString -#define ENGINE_DRIVER_PARAMETER_SHORT_DESCR "Driver to use" -#define ENGINE_DRIVER_PARAMETER_LONG_DESCR "" - -struct parameter_info -{ - unsigned char type; - const char * name; - const char * short_decr; - const char * long_descr; -}; - unsigned char jack_controller_dbus_types[JACK_PARAM_MAX] = { [JackParamInt] = DBUS_TYPE_INT32, @@ -238,12 +220,13 @@ jack_controller_dbus_get_parameter_address_ex( index = 0; while ((type = dbus_message_iter_get_arg_type(&array_iter)) != DBUS_TYPE_INVALID) { - if (index == 3) + if (index == PARAM_ADDRESS_SIZE) { jack_dbus_error( call, JACK_DBUS_ERROR_INVALID_ARGS, - "Invalid arguments to method '%s'. Parameter address array must contain not more than three elements.", + "Invalid arguments to method '%s'. Parameter address array must contain not more than %u elements.", + (unsigned int)PARAM_ADDRESS_SIZE, call->method_name); return false; } @@ -267,7 +250,7 @@ jack_controller_dbus_get_parameter_address_ex( index++; } - while (index < 3) + while (index < PARAM_ADDRESS_SIZE) { address_array[index] = NULL; index++; @@ -301,45 +284,9 @@ jack_controller_dbus_get_parameter_address( #define controller_ptr ((struct jack_controller *)call->context) -static -bool -jack_controller_fill_parameter_names( - struct jack_dbus_method_call * call, - DBusMessageIter * iter_ptr, - const char * special_first, - const JSList * parameters_list) +static bool append_node_name(void * context, const char * name) { - DBusMessageIter array_iter; - const char * param_name; - - if (!dbus_message_iter_open_container(iter_ptr, DBUS_TYPE_ARRAY, "s", &array_iter)) - { - return false; - } - - if (special_first != NULL) - { - if (!dbus_message_iter_append_basic(&array_iter, DBUS_TYPE_STRING, &special_first)) - { - dbus_message_iter_close_container(iter_ptr, &array_iter); - return false; - } - } - - /* Append parameter descriptions to the array. */ - while (parameters_list != NULL) - { - param_name = jackctl_parameter_get_name(parameters_list->data); - if (!dbus_message_iter_append_basic(&array_iter, DBUS_TYPE_STRING, ¶m_name)) - { - dbus_message_iter_close_container(iter_ptr, &array_iter); - return false; - } - - parameters_list = jack_slist_next(parameters_list); - } - - return dbus_message_iter_close_container(iter_ptr, &array_iter); + return dbus_message_iter_append_basic(context, DBUS_TYPE_STRING, &name); } static @@ -347,14 +294,10 @@ void jack_controller_dbus_read_container( struct jack_dbus_method_call * call) { - const char * address[3]; + const char * address[PARAM_ADDRESS_SIZE]; dbus_bool_t leaf; DBusMessageIter iter; DBusMessageIter array_iter; - const char * child_name; - unsigned int index; - jackctl_internal_t * internal; - jackctl_driver_t * driver; //jack_info("jack_controller_dbus_read_container() called"); @@ -377,218 +320,37 @@ jack_controller_dbus_read_container( dbus_message_iter_init_append(call->reply, &iter); - if (address[0] == NULL) /* root node */ + if (!jack_params_check_address(controller_ptr->params, address, false)) { - //jack_info("reading root container"); - - leaf = false; - if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_BOOLEAN, &leaf)) - { - goto oom_unref; - } - - if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "s", &array_iter)) - { - goto oom_unref; - } - - child_name = PTNODE_ENGINE; - if (!dbus_message_iter_append_basic(&array_iter, DBUS_TYPE_STRING, &child_name)) - { - goto oom_close_unref; - } - - child_name = PTNODE_DRIVER; - if (!dbus_message_iter_append_basic(&array_iter, DBUS_TYPE_STRING, &child_name)) - { - goto oom_close_unref; - } - - child_name = PTNODE_DRIVERS; - if (!dbus_message_iter_append_basic(&array_iter, DBUS_TYPE_STRING, &child_name)) - { - goto oom_close_unref; - } - - child_name = PTNODE_INTERNALS; - if (!dbus_message_iter_append_basic(&array_iter, DBUS_TYPE_STRING, &child_name)) - { - goto oom_close_unref; - } - - dbus_message_iter_close_container(&iter, &array_iter); - + jack_dbus_error( + call, + JACK_DBUS_ERROR_INVALID_ARGS, + "Invalid container address '%s':'%s':'%s' supplied to method '%s'.", + address[0], + address[1], + address[2], + call->method_name); return; } - if (address[0] != NULL && - address[1] == NULL && - strcmp(address[0], PTNODE_ENGINE) == 0) /* engine parameters requested */ + leaf = jack_params_is_leaf_container(controller_ptr->params, address); + if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_BOOLEAN, &leaf)) { - //jack_info("reading engine params container"); - - leaf = true; - if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_BOOLEAN, &leaf)) - { - goto oom_unref; - } - - if (!jack_controller_fill_parameter_names( - call, - &iter, - ENGINE_DRIVER_PARAMETER_NAME, - jackctl_server_get_parameters(controller_ptr->server))) - { - goto oom_unref; - } - - return; + goto oom_unref; } - if (address[0] != NULL && - address[1] == NULL && - strcmp(address[0], PTNODE_DRIVER) == 0) /* current driver parameters requested */ + if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "s", &array_iter)) { - //jack_info("reading current driver params container"); - - leaf = true; - if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_BOOLEAN, &leaf)) - { - goto oom_unref; - } - - if (!jack_controller_fill_parameter_names( - call, - &iter, - NULL, - jackctl_driver_get_parameters(controller_ptr->driver))) - { - goto oom_unref; - } - - return; + goto oom_unref; } - if (address[0] != NULL && - strcmp(address[0], PTNODE_DRIVERS) == 0) - { - leaf = address[1] != NULL; - if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_BOOLEAN, &leaf)) - { - goto oom_unref; - } - - if (!leaf) /* available drivers requested */ - { - //jack_info("reading drivers container"); - - if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "s", &array_iter)) - { - goto oom_unref; - } - - for (index = 0; index < controller_ptr->drivers_count; index++) - { - if (!dbus_message_iter_append_basic(&array_iter, DBUS_TYPE_STRING, controller_ptr->driver_names + index)) - { - goto oom_close_unref; - } - } - - dbus_message_iter_close_container(&iter, &array_iter); - } - else /* specified driver parameters requested */ - { - //jack_info("reading driver '%s' params container", address[1]); - - driver = jack_controller_find_driver(controller_ptr->server, address[1]); - if (driver == NULL) - { - jack_dbus_error( - call, - JACK_DBUS_ERROR_UNKNOWN_INTERNAL, - "Unknown driver '%s'", - address[1]); - return; - } - if (!jack_controller_fill_parameter_names( - call, - &iter, - NULL, - jackctl_driver_get_parameters(driver))) - { - goto oom_unref; - } - } - - return; - } - - if (address[0] != NULL && - strcmp(address[0], PTNODE_INTERNALS) == 0) + if (!jack_params_iterate_container(controller_ptr->params, address, append_node_name, &array_iter)) { - leaf = address[1] != NULL; - if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_BOOLEAN, &leaf)) - { - goto oom_unref; - } - - if (!leaf) /* available internals requested */ - { - //jack_info("reading internals container"); - - if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "s", &array_iter)) - { - goto oom_unref; - } - - for (index = 0; index < controller_ptr->internals_count; index++) - { - if (!dbus_message_iter_append_basic(&array_iter, DBUS_TYPE_STRING, controller_ptr->internal_names + index)) - { - goto oom_close_unref; - } - } - - dbus_message_iter_close_container(&iter, &array_iter); - } - else /* specified driver parameters requested */ - { - //jack_info("reading internal '%s' params container", address[1]); - - internal = jack_controller_find_internal(controller_ptr->server, address[1]); - if (internal == NULL) - { - jack_dbus_error( - call, - JACK_DBUS_ERROR_UNKNOWN_INTERNAL, - "Unknown internal '%s'", - address[1]); - return; - } - - if (!jack_controller_fill_parameter_names( - call, - &iter, - NULL, - jackctl_internal_get_parameters(internal))) - { - goto oom_unref; - } - } - - return; + goto oom_close_unref; } - jack_dbus_error( - call, - JACK_DBUS_ERROR_INVALID_ARGS, - "Invalid container address '%s':'%s':'%s' supplied to method '%s'.", - address[0], - address[1], - address[2], - call->method_name); + dbus_message_iter_close_container(&iter, &array_iter); return; @@ -603,60 +365,44 @@ oom: jack_error ("Ran out of memory trying to construct method return"); } -static -void -jack_controller_fill_parameter_info( - jackctl_parameter_t * parameter, - struct parameter_info * info_ptr) -{ - info_ptr->type = jackctl_parameter_get_type(parameter); - info_ptr->name = jackctl_parameter_get_name(parameter); - info_ptr->short_decr = jackctl_parameter_get_short_description(parameter); - info_ptr->long_descr = jackctl_parameter_get_long_description(parameter); -} - -static -bool -jack_controller_append_parameter_info_struct( - DBusMessageIter * iter_ptr, - struct parameter_info * info_ptr) +static bool append_parameter(void * context, const struct jack_parameter * param_ptr) { DBusMessageIter struct_iter; unsigned char type; /* Open the struct. */ - if (!dbus_message_iter_open_container(iter_ptr, DBUS_TYPE_STRUCT, NULL, &struct_iter)) + if (!dbus_message_iter_open_container(context, DBUS_TYPE_STRUCT, NULL, &struct_iter)) { goto fail; } /* Append parameter type. */ - type = PARAM_TYPE_JACK_TO_DBUS(info_ptr->type); + type = PARAM_TYPE_JACK_TO_DBUS(param_ptr->type); if (!dbus_message_iter_append_basic(&struct_iter, DBUS_TYPE_BYTE, &type)) { goto fail_close; } /* Append parameter name. */ - if (!dbus_message_iter_append_basic(&struct_iter, DBUS_TYPE_STRING, &info_ptr->name)) + if (!dbus_message_iter_append_basic(&struct_iter, DBUS_TYPE_STRING, ¶m_ptr->name)) { goto fail_close; } /* Append parameter short description. */ - if (!dbus_message_iter_append_basic(&struct_iter, DBUS_TYPE_STRING, &info_ptr->short_decr)) + if (!dbus_message_iter_append_basic(&struct_iter, DBUS_TYPE_STRING, ¶m_ptr->short_decr)) { goto fail_close; } /* Append parameter long description. */ - if (!dbus_message_iter_append_basic(&struct_iter, DBUS_TYPE_STRING, &info_ptr->long_descr)) + if (!dbus_message_iter_append_basic(&struct_iter, DBUS_TYPE_STRING, ¶m_ptr->long_descr)) { goto fail_close; } /* Close the struct. */ - if (!dbus_message_iter_close_container(iter_ptr, &struct_iter)) + if (!dbus_message_iter_close_container(context, &struct_iter)) { goto fail; } @@ -664,7 +410,7 @@ jack_controller_append_parameter_info_struct( return true; fail_close: - dbus_message_iter_close_container(iter_ptr, &struct_iter); + dbus_message_iter_close_container(context, &struct_iter); fail: return false; @@ -672,13 +418,36 @@ fail: static void -jack_controller_get_parameters_info( - struct jack_dbus_method_call * call, - struct parameter_info * special_parameter_info_ptr, - const JSList * parameters_list) +jack_controller_dbus_get_parameters_info( + struct jack_dbus_method_call * call) { + const char * address[PARAM_ADDRESS_SIZE]; DBusMessageIter iter, array_iter; - struct parameter_info info; + + //jack_info("jack_controller_dbus_get_parameters_info() called"); + + if (!jack_controller_dbus_get_parameter_address(call, address)) + { + /* The method call had invalid arguments meaning that + * jack_controller_dbus_get_parameter_address() has + * constructed an error for us. */ + return; + } + + //jack_info("address is '%s':'%s':'%s'", address[0], address[1], address[2]); + + if (!jack_params_check_address(controller_ptr->params, address, true)) + { + jack_dbus_error( + call, + JACK_DBUS_ERROR_INVALID_ARGS, + "Invalid container address '%s':'%s':'%s' supplied to method '%s'.", + address[0], + address[1], + address[2], + call->method_name); + return; + } call->reply = dbus_message_new_method_return (call->message); if (!call->reply) @@ -694,24 +463,9 @@ jack_controller_get_parameters_info( goto fail_unref; } - if (special_parameter_info_ptr != NULL) - { - if (!jack_controller_append_parameter_info_struct(&array_iter, special_parameter_info_ptr)) - { - goto fail_close_unref; - } - } - - /* Append parameter descriptions to the array. */ - while (parameters_list != NULL) + if (!jack_params_iterate_params(controller_ptr->params, address, append_parameter, &array_iter)) { - jack_controller_fill_parameter_info(parameters_list->data, &info); - if (!jack_controller_append_parameter_info_struct(&array_iter, &info)) - { - goto fail_close_unref; - } - - parameters_list = jack_slist_next(parameters_list); + goto fail_close_unref; } /* Close the array. */ @@ -735,15 +489,14 @@ fail: static void -jack_controller_dbus_get_parameters_info( +jack_controller_dbus_get_parameter_info( struct jack_dbus_method_call * call) { - const char * address[3]; - jackctl_internal_t * internal; - jackctl_driver_t * driver; - struct parameter_info driver_parameter_info; + const char * address[PARAM_ADDRESS_SIZE]; + const struct jack_parameter * param_ptr; + DBusMessageIter iter; - //jack_info("jack_controller_dbus_get_parameters_info() called"); + //jack_info("jack_controller_dbus_get_parameter_info() called"); if (!jack_controller_dbus_get_parameter_address(call, address)) { @@ -755,101 +508,20 @@ jack_controller_dbus_get_parameters_info( //jack_info("address is '%s':'%s':'%s'", address[0], address[1], address[2]); - if (address[0] != NULL && - address[1] == NULL && - strcmp(address[0], PTNODE_ENGINE) == 0) /* engine parameters requested */ - { - driver_parameter_info.type = ENGINE_DRIVER_PARAMETER_TYPE; - driver_parameter_info.name = ENGINE_DRIVER_PARAMETER_NAME; - driver_parameter_info.short_decr = ENGINE_DRIVER_PARAMETER_SHORT_DESCR; - driver_parameter_info.long_descr = ENGINE_DRIVER_PARAMETER_LONG_DESCR; - - jack_controller_get_parameters_info( - call, - &driver_parameter_info, - jackctl_server_get_parameters(controller_ptr->server)); - - return; - } - - if (address[0] != NULL && - address[1] == NULL && - strcmp(address[0], PTNODE_DRIVER) == 0) /* current driver parameters requested */ - { - jack_controller_get_parameters_info( - call, - NULL, - jackctl_driver_get_parameters(controller_ptr->driver)); - - return; - } - - if (address[0] != NULL && - address[1] != NULL && - address[2] == NULL && - strcmp(address[0], PTNODE_DRIVERS) == 0) - { - driver = jack_controller_find_driver(controller_ptr->server, address[1]); - if (driver == NULL) - { - jack_dbus_error( - call, - JACK_DBUS_ERROR_UNKNOWN_INTERNAL, - "Unknown driver '%s'", - address[1]); - return; - } - - jack_controller_get_parameters_info( - call, - NULL, - jackctl_driver_get_parameters(driver)); - - return; - } - - if (address[0] != NULL && - address[1] != NULL && - address[2] == NULL && - strcmp(address[0], PTNODE_INTERNALS) == 0) + param_ptr = jack_params_get_parameter(controller_ptr->params, address); + if (param_ptr == NULL) { - internal = jack_controller_find_internal(controller_ptr->server, address[1]); - if (internal == NULL) - { - jack_dbus_error( - call, - JACK_DBUS_ERROR_UNKNOWN_INTERNAL, - "Unknown internal '%s'", - address[1]); - return; - } - - jack_controller_get_parameters_info( + jack_dbus_error( call, - NULL, - jackctl_internal_get_parameters(internal)); - + JACK_DBUS_ERROR_INVALID_ARGS, + "Invalid container address '%s':'%s':'%s' supplied to method '%s'.", + address[0], + address[1], + address[2], + call->method_name); return; } - jack_dbus_error( - call, - JACK_DBUS_ERROR_INVALID_ARGS, - "Invalid container address '%s':'%s':'%s' supplied to method '%s'.", - address[0], - address[1], - address[2], - call->method_name); -} - -static -void -jack_controller_get_parameter_info_ex( - struct jack_dbus_method_call * call, - struct parameter_info * info_ptr) -{ - DBusMessageIter iter; - call->reply = dbus_message_new_method_return(call->message); if (!call->reply) { @@ -858,7 +530,7 @@ jack_controller_get_parameter_info_ex( dbus_message_iter_init_append(call->reply, &iter); - if (!jack_controller_append_parameter_info_struct(&iter, info_ptr)) + if (!append_parameter(&iter, param_ptr)) { goto fail_unref; } @@ -875,28 +547,17 @@ fail: static void -jack_controller_get_parameter_info( - struct jack_dbus_method_call * call, - jackctl_parameter_t * parameter) -{ - struct parameter_info info; - - jack_controller_fill_parameter_info(parameter, &info); - jack_controller_get_parameter_info_ex(call, &info); -} - -static -void -jack_controller_dbus_get_parameter_info( +jack_controller_dbus_get_parameter_constraint( struct jack_dbus_method_call * call) { - const char * address[3]; - jackctl_internal_t * internal; - jackctl_driver_t * driver; - jackctl_parameter_t * parameter; - struct parameter_info driver_parameter_info; + const char * address[PARAM_ADDRESS_SIZE]; + const struct jack_parameter * param_ptr; + uint32_t index; + DBusMessageIter iter, array_iter, struct_iter; + const char * descr; + message_arg_t value; - //jack_info("jack_controller_dbus_get_parameter_info() called"); + //jack_info("jack_controller_dbus_get_parameter_constraint() called"); if (!jack_controller_dbus_get_parameter_address(call, address)) { @@ -908,178 +569,57 @@ jack_controller_dbus_get_parameter_info( //jack_info("address is '%s':'%s':'%s'", address[0], address[1], address[2]); - if (address[0] != NULL && - address[1] != NULL && - address[2] == NULL && - strcmp(address[0], PTNODE_ENGINE) == 0) /* engine parameters requested */ + param_ptr = jack_params_get_parameter(controller_ptr->params, address); + if (param_ptr == NULL) { - if (strcmp(address[1], ENGINE_DRIVER_PARAMETER_NAME) == 0) - { - driver_parameter_info.type = ENGINE_DRIVER_PARAMETER_TYPE; - driver_parameter_info.name = ENGINE_DRIVER_PARAMETER_NAME; - driver_parameter_info.short_decr = ENGINE_DRIVER_PARAMETER_SHORT_DESCR; - driver_parameter_info.long_descr = ENGINE_DRIVER_PARAMETER_LONG_DESCR; - - jack_controller_get_parameter_info_ex(call, &driver_parameter_info); - - return; - } - - parameter = jack_controller_find_parameter(jackctl_server_get_parameters(controller_ptr->server), address[1]); - if (parameter == NULL) - { - jack_dbus_error( - call, - JACK_DBUS_ERROR_UNKNOWN_PARAMETER, - "Unknown engine parameter '%s'", - address[1]); - return; - } - - jack_controller_get_parameter_info(call, parameter); - + jack_dbus_error( + call, + JACK_DBUS_ERROR_INVALID_ARGS, + "Invalid container address '%s':'%s':'%s' supplied to method '%s'.", + address[0], + address[1], + address[2], + call->method_name); return; } - if (address[0] != NULL && - address[1] != NULL && - address[2] == NULL && - strcmp(address[0], PTNODE_DRIVER) == 0) /* current driver parameters requested */ + call->reply = dbus_message_new_method_return(call->message); + if (!call->reply) { - parameter = jack_controller_find_parameter(jackctl_driver_get_parameters(controller_ptr->driver), address[1]); - if (parameter == NULL) - { - jack_dbus_error( - call, - JACK_DBUS_ERROR_UNKNOWN_PARAMETER, - "Unknown parameter '%s' for driver '%s'", - address[1], - jackctl_driver_get_name(controller_ptr->driver)); - return; - } + goto fail; + } - jack_controller_get_parameter_info(call, parameter); + dbus_message_iter_init_append(call->reply, &iter); - return; + if ((param_ptr->constraint_flags & JACK_CONSTRAINT_FLAG_VALID) != 0) + { + value.boolean = param_ptr->constraint_range; } - - if (address[0] != NULL && - address[1] != NULL && - address[2] != NULL && - strcmp(address[0], PTNODE_DRIVERS) == 0) + else { - driver = jack_controller_find_driver(controller_ptr->server, address[1]); - if (driver == NULL) - { - jack_dbus_error( - call, - JACK_DBUS_ERROR_UNKNOWN_INTERNAL, - "Unknown driver '%s'", - address[1]); - return; - } + value.boolean = false; + } - parameter = jack_controller_find_parameter(jackctl_driver_get_parameters(driver), address[2]); - if (parameter == NULL) - { - jack_dbus_error( - call, - JACK_DBUS_ERROR_UNKNOWN_PARAMETER, - "Unknown parameter '%s' for driver '%s'", - address[2], - address[1]); - return; - } - - jack_controller_get_parameter_info(call, parameter); - - return; - } - - if (address[0] != NULL && - address[1] != NULL && - address[2] != NULL && - strcmp(address[0], PTNODE_INTERNALS) == 0) + if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_BOOLEAN, &value)) { - internal = jack_controller_find_internal(controller_ptr->server, address[1]); - if (internal == NULL) - { - jack_dbus_error( - call, - JACK_DBUS_ERROR_UNKNOWN_INTERNAL, - "Unknown internal '%s'", - address[1]); - return; - } - - parameter = jack_controller_find_parameter(jackctl_internal_get_parameters(internal), address[2]); - if (parameter == NULL) - { - jack_dbus_error( - call, - JACK_DBUS_ERROR_UNKNOWN_PARAMETER, - "Unknown parameter '%s' for internal '%s'", - address[2], - address[1]); - return; - } - - jack_controller_get_parameter_info(call, parameter); - - return; + goto fail_unref; } - jack_dbus_error( - call, - JACK_DBUS_ERROR_INVALID_ARGS, - "Invalid container address '%s':'%s':'%s' supplied to method '%s'.", - address[0], - address[1], - address[2], - call->method_name); -} - -static -void -jack_controller_get_parameter_constraint( - struct jack_dbus_method_call * call, - jackctl_parameter_t * parameter) -{ - uint32_t index; - uint32_t count; - union jackctl_parameter_value min; - union jackctl_parameter_value max; - union jackctl_parameter_value jackctl_value; - DBusMessageIter iter, array_iter, struct_iter; - const char * descr; - jackctl_param_type_t type; - message_arg_t value; - bool is_range; - - type = jackctl_parameter_get_type(parameter); - - call->reply = dbus_message_new_method_return(call->message); - if (!call->reply) + if ((param_ptr->constraint_flags & JACK_CONSTRAINT_FLAG_VALID) != 0) { - goto fail; + value.boolean = (param_ptr->constraint_flags & JACK_CONSTRAINT_FLAG_STRICT) != 0; } - dbus_message_iter_init_append(call->reply, &iter); - - is_range = jackctl_parameter_has_range_constraint(parameter); - value.boolean = is_range; if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_BOOLEAN, &value)) { goto fail_unref; } - value.boolean = jackctl_parameter_constraint_is_strict(parameter); - if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_BOOLEAN, &value)) + if ((param_ptr->constraint_flags & JACK_CONSTRAINT_FLAG_VALID) != 0) { - goto fail_unref; + value.boolean = (param_ptr->constraint_flags & JACK_CONSTRAINT_FLAG_FAKE_VALUE) != 0; } - value.boolean = jackctl_parameter_constraint_is_fake_value(parameter); if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_BOOLEAN, &value)) { goto fail_unref; @@ -1091,19 +631,26 @@ jack_controller_get_parameter_constraint( goto fail_unref; } - if (is_range) + if ((param_ptr->constraint_flags & JACK_CONSTRAINT_FLAG_VALID) == 0) { - jackctl_parameter_get_range_constraint(parameter, &min, &max); + goto close; + } + if (param_ptr->constraint_range) + { /* Open the struct. */ if (!dbus_message_iter_open_container(&array_iter, DBUS_TYPE_STRUCT, NULL, &struct_iter)) { goto fail_close_unref; } - jack_controller_jack_to_dbus_variant(type, &min, &value); + jack_controller_jack_to_dbus_variant(param_ptr->type, ¶m_ptr->constraint.range.min, &value); - if (!jack_dbus_message_append_variant(&struct_iter, PARAM_TYPE_JACK_TO_DBUS(type), PARAM_TYPE_JACK_TO_DBUS_SIGNATURE(type), &value)) + if (!jack_dbus_message_append_variant( + &struct_iter, + PARAM_TYPE_JACK_TO_DBUS(param_ptr->type), + PARAM_TYPE_JACK_TO_DBUS_SIGNATURE(param_ptr->type), + &value)) { goto fail_close2_unref; } @@ -1127,9 +674,13 @@ jack_controller_get_parameter_constraint( goto fail_close_unref; } - jack_controller_jack_to_dbus_variant(type, &max, &value); + jack_controller_jack_to_dbus_variant(param_ptr->type, ¶m_ptr->constraint.range.max, &value); - if (!jack_dbus_message_append_variant(&struct_iter, PARAM_TYPE_JACK_TO_DBUS(type), PARAM_TYPE_JACK_TO_DBUS_SIGNATURE(type), &value)) + if (!jack_dbus_message_append_variant( + &struct_iter, + PARAM_TYPE_JACK_TO_DBUS(param_ptr->type), + PARAM_TYPE_JACK_TO_DBUS_SIGNATURE(param_ptr->type), + &value)) { goto fail_close2_unref; } @@ -1149,15 +700,12 @@ jack_controller_get_parameter_constraint( } else { - count = jackctl_parameter_get_enum_constraints_count(parameter); - /* Append enum values to the array. */ - for (index = 0 ; index < count ; index++) + for (index = 0 ; index < param_ptr->constraint.enumeration.count ; index++) { - jackctl_value = jackctl_parameter_get_enum_constraint_value(parameter, index); - descr = jackctl_parameter_get_enum_constraint_description(parameter, index); + descr = param_ptr->constraint.enumeration.possible_values_array[index].short_desc; - jack_controller_jack_to_dbus_variant(type, &jackctl_value, &value); + jack_controller_jack_to_dbus_variant(param_ptr->type, ¶m_ptr->constraint.enumeration.possible_values_array[index].value, &value); /* Open the struct. */ if (!dbus_message_iter_open_container(&array_iter, DBUS_TYPE_STRUCT, NULL, &struct_iter)) @@ -1165,7 +713,11 @@ jack_controller_get_parameter_constraint( goto fail_close_unref; } - if (!jack_dbus_message_append_variant(&struct_iter, PARAM_TYPE_JACK_TO_DBUS(type), PARAM_TYPE_JACK_TO_DBUS_SIGNATURE(type), &value)) + if (!jack_dbus_message_append_variant( + &struct_iter, + PARAM_TYPE_JACK_TO_DBUS(param_ptr->type), + PARAM_TYPE_JACK_TO_DBUS_SIGNATURE(param_ptr->type), + &value)) { goto fail_close2_unref; } @@ -1183,6 +735,7 @@ jack_controller_get_parameter_constraint( } } +close: /* Close the array. */ if (!dbus_message_iter_close_container(&iter, &array_iter)) { @@ -1205,315 +758,17 @@ fail: jack_error ("Ran out of memory trying to construct method return"); } -static -void -jack_controller_get_parameter_constraint_engine_driver( - struct jack_dbus_method_call * call) -{ - unsigned int index; - DBusMessageIter iter, array_iter, struct_iter; - jackctl_param_type_t type; - dbus_bool_t bval; - message_arg_t value; - - type = ENGINE_DRIVER_PARAMETER_TYPE; - - call->reply = dbus_message_new_method_return(call->message); - if (!call->reply) - { - goto fail; - } - - dbus_message_iter_init_append(call->reply, &iter); - - /* is_range */ - bval = false; - if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_BOOLEAN, &bval)) - { - goto fail_unref; - } - - /* is_strict */ - bval = true; - if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_BOOLEAN, &bval)) - { - goto fail_unref; - } - - /* is_fake_value */ - bval = true; - if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_BOOLEAN, &bval)) - { - goto fail_unref; - } - - /* Open the array. */ - if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, "(vs)", &array_iter)) - { - goto fail_unref; - } - - /* Append enum values to the array. */ - for (index = 0 ; index < controller_ptr->drivers_count ; index++) - { - /* Open the struct. */ - if (!dbus_message_iter_open_container(&array_iter, DBUS_TYPE_STRUCT, NULL, &struct_iter)) - { - goto fail_close_unref; - } - - value.string = controller_ptr->driver_names[index]; - if (!jack_dbus_message_append_variant( - &struct_iter, - PARAM_TYPE_JACK_TO_DBUS(type), - PARAM_TYPE_JACK_TO_DBUS_SIGNATURE(type), - &value)) - { - goto fail_close2_unref; - } - - if (!dbus_message_iter_append_basic(&struct_iter, DBUS_TYPE_STRING, &value)) - { - goto fail_close2_unref; - } - - /* Close the struct. */ - if (!dbus_message_iter_close_container(&array_iter, &struct_iter)) - { - goto fail_close_unref; - } - } - - /* Close the array. */ - if (!dbus_message_iter_close_container(&iter, &array_iter)) - { - goto fail_unref; - } - - return; - -fail_close2_unref: - dbus_message_iter_close_container(&array_iter, &struct_iter); - -fail_close_unref: - dbus_message_iter_close_container(&iter, &array_iter); - -fail_unref: - dbus_message_unref(call->reply); - call->reply = NULL; - -fail: - jack_error ("Ran out of memory trying to construct method return"); -} - -static -void -jack_controller_dbus_get_parameter_constraint( +static void +jack_controller_dbus_get_parameter_value( struct jack_dbus_method_call * call) { - const char * address[3]; - jackctl_internal_t * internal; - jackctl_driver_t * driver; - jackctl_parameter_t * parameter; - - //jack_info("jack_controller_dbus_get_parameter_constraint() called"); - - if (!jack_controller_dbus_get_parameter_address(call, address)) - { - /* The method call had invalid arguments meaning that - * jack_controller_dbus_get_parameter_address() has - * constructed an error for us. */ - return; - } - - //jack_info("address is '%s':'%s':'%s'", address[0], address[1], address[2]); - - if (address[0] != NULL && - address[1] != NULL && - address[2] == NULL && - strcmp(address[0], PTNODE_ENGINE) == 0) /* engine parameters requested */ - { - if (strcmp(address[1], ENGINE_DRIVER_PARAMETER_NAME) == 0) - { - jack_controller_get_parameter_constraint_engine_driver(call); - - return; - } - - parameter = jack_controller_find_parameter(jackctl_server_get_parameters(controller_ptr->server), address[1]); - if (parameter == NULL) - { - jack_dbus_error( - call, - JACK_DBUS_ERROR_UNKNOWN_PARAMETER, - "Unknown engine parameter '%s'", - address[1]); - return; - } - - jack_controller_get_parameter_constraint(call, parameter); - - return; - } - - if (address[0] != NULL && - address[1] != NULL && - address[2] == NULL && - strcmp(address[0], PTNODE_DRIVER) == 0) /* current driver parameters requested */ - { - parameter = jack_controller_find_parameter(jackctl_driver_get_parameters(controller_ptr->driver), address[1]); - if (parameter == NULL) - { - jack_dbus_error( - call, - JACK_DBUS_ERROR_UNKNOWN_PARAMETER, - "Unknown parameter '%s' for driver '%s'", - address[1], - jackctl_driver_get_name(controller_ptr->driver)); - return; - } - - jack_controller_get_parameter_constraint(call, parameter); - - return; - } - - if (address[0] != NULL && - address[1] != NULL && - address[2] != NULL && - strcmp(address[0], PTNODE_DRIVERS) == 0) - { - driver = jack_controller_find_driver(controller_ptr->server, address[1]); - if (driver == NULL) - { - jack_dbus_error( - call, - JACK_DBUS_ERROR_UNKNOWN_INTERNAL, - "Unknown driver '%s'", - address[1]); - return; - } - - parameter = jack_controller_find_parameter(jackctl_driver_get_parameters(driver), address[2]); - if (parameter == NULL) - { - jack_dbus_error( - call, - JACK_DBUS_ERROR_UNKNOWN_PARAMETER, - "Unknown parameter '%s' for driver '%s'", - address[2], - address[1]); - return; - } - - jack_controller_get_parameter_constraint(call, parameter); - - return; - } - - if (address[0] != NULL && - address[1] != NULL && - address[2] != NULL && - strcmp(address[0], PTNODE_INTERNALS) == 0) - { - internal = jack_controller_find_internal(controller_ptr->server, address[1]); - if (internal == NULL) - { - jack_dbus_error( - call, - JACK_DBUS_ERROR_UNKNOWN_INTERNAL, - "Unknown internal '%s'", - address[1]); - return; - } - - parameter = jack_controller_find_parameter(jackctl_internal_get_parameters(internal), address[2]); - if (parameter == NULL) - { - jack_dbus_error( - call, - JACK_DBUS_ERROR_UNKNOWN_PARAMETER, - "Unknown parameter '%s' for internal '%s'", - address[2], - address[1]); - return; - } - - jack_controller_get_parameter_constraint(call, parameter); - - return; - } - - jack_dbus_error( - call, - JACK_DBUS_ERROR_INVALID_ARGS, - "Invalid container address '%s':'%s':'%s' supplied to method '%s'.", - address[0], - address[1], - address[2], - call->method_name); -} - -static -void -jack_controller_get_parameter_value( - struct jack_dbus_method_call * call, - jackctl_parameter_t * parameter) -{ - int type; + const char * address[PARAM_ADDRESS_SIZE]; + const struct jack_parameter * param_ptr; union jackctl_parameter_value jackctl_value; union jackctl_parameter_value jackctl_default_value; message_arg_t value; message_arg_t default_value; - type = jackctl_parameter_get_type(parameter); - jackctl_default_value = jackctl_parameter_get_default_value(parameter); - jackctl_value = jackctl_parameter_get_value(parameter); - - jack_controller_jack_to_dbus_variant(type, &jackctl_value, &value); - jack_controller_jack_to_dbus_variant(type, &jackctl_default_value, &default_value); - - /* Construct the reply. */ - jack_dbus_construct_method_return_parameter( - call, - (dbus_bool_t)(jackctl_parameter_is_set(parameter) ? TRUE : FALSE), - PARAM_TYPE_JACK_TO_DBUS(type), - PARAM_TYPE_JACK_TO_DBUS_SIGNATURE(type), - default_value, - value); -} - -static -void -jack_controller_get_parameter_value_engine_driver( - struct jack_dbus_method_call * call) -{ - message_arg_t value; - message_arg_t default_value; - - default_value.string = DEFAULT_DRIVER; - value.string = jackctl_driver_get_name(controller_ptr->driver); - - /* Construct the reply. */ - jack_dbus_construct_method_return_parameter( - call, - controller_ptr->driver_set, - DBUS_TYPE_STRING, - DBUS_TYPE_STRING_AS_STRING, - default_value, - value); -} - - -static void -jack_controller_dbus_get_parameter_value( - struct jack_dbus_method_call * call) -{ - const char * address[3]; - jackctl_internal_t * internal; - jackctl_driver_t * driver; - jackctl_parameter_t * parameter; - //jack_info("jack_controller_dbus_get_parameter_value() called"); if (!jack_controller_dbus_get_parameter_address(call, address)) @@ -1526,221 +781,34 @@ jack_controller_dbus_get_parameter_value( //jack_info("address is '%s':'%s':'%s'", address[0], address[1], address[2]); - if (address[0] != NULL && - address[1] != NULL && - address[2] == NULL && - strcmp(address[0], PTNODE_ENGINE) == 0) /* engine parameters requested */ - { - if (strcmp(address[1], ENGINE_DRIVER_PARAMETER_NAME) == 0) - { - jack_controller_get_parameter_value_engine_driver(call); - - return; - } - - parameter = jack_controller_find_parameter(jackctl_server_get_parameters(controller_ptr->server), address[1]); - if (parameter == NULL) - { - jack_dbus_error( - call, - JACK_DBUS_ERROR_UNKNOWN_PARAMETER, - "Unknown engine parameter '%s'", - address[1]); - return; - } - - jack_controller_get_parameter_value(call, parameter); - - return; - } - - if (address[0] != NULL && - address[1] != NULL && - address[2] == NULL && - strcmp(address[0], PTNODE_DRIVER) == 0) /* current driver parameters requested */ - { - parameter = jack_controller_find_parameter(jackctl_driver_get_parameters(controller_ptr->driver), address[1]); - if (parameter == NULL) - { - jack_dbus_error( - call, - JACK_DBUS_ERROR_UNKNOWN_PARAMETER, - "Unknown parameter '%s' for driver '%s'", - address[1], - jackctl_driver_get_name(controller_ptr->driver)); - return; - } - - jack_controller_get_parameter_value(call, parameter); - - return; - } - - if (address[0] != NULL && - address[1] != NULL && - address[2] != NULL && - strcmp(address[0], PTNODE_DRIVERS) == 0) - { - driver = jack_controller_find_driver(controller_ptr->server, address[1]); - if (driver == NULL) - { - jack_dbus_error( - call, - JACK_DBUS_ERROR_UNKNOWN_INTERNAL, - "Unknown driver '%s'", - address[1]); - return; - } - - parameter = jack_controller_find_parameter(jackctl_driver_get_parameters(driver), address[2]); - if (parameter == NULL) - { - jack_dbus_error( - call, - JACK_DBUS_ERROR_UNKNOWN_PARAMETER, - "Unknown parameter '%s' for driver '%s'", - address[2], - address[1]); - return; - } - - jack_controller_get_parameter_value(call, parameter); - - return; - } - - if (address[0] != NULL && - address[1] != NULL && - address[2] != NULL && - strcmp(address[0], PTNODE_INTERNALS) == 0) - { - internal = jack_controller_find_internal(controller_ptr->server, address[1]); - if (internal == NULL) - { - jack_dbus_error( - call, - JACK_DBUS_ERROR_UNKNOWN_INTERNAL, - "Unknown internal '%s'", - address[1]); - return; - } - - parameter = jack_controller_find_parameter(jackctl_internal_get_parameters(internal), address[2]); - if (parameter == NULL) - { - jack_dbus_error( - call, - JACK_DBUS_ERROR_UNKNOWN_PARAMETER, - "Unknown parameter '%s' for internal '%s'", - address[2], - address[1]); - return; - } - - jack_controller_get_parameter_value(call, parameter); - - return; - } - - jack_dbus_error( - call, - JACK_DBUS_ERROR_INVALID_ARGS, - "Invalid container address '%s':'%s':'%s' supplied to method '%s'.", - address[0], - address[1], - address[2], - call->method_name); -} - -static -void -jack_controller_set_parameter_value( - struct jack_dbus_method_call * call, - jackctl_parameter_t * parameter, - message_arg_t * arg_ptr, - int arg_type) -{ - jackctl_param_type_t type; - union jackctl_parameter_value value; - - type = jackctl_parameter_get_type(parameter); - - if (PARAM_TYPE_JACK_TO_DBUS(type) != arg_type) - { - jack_dbus_error( - call, - JACK_DBUS_ERROR_INVALID_ARGS, - "Parameter value type mismatch: was expecting '%c', got '%c'", - (char)PARAM_TYPE_JACK_TO_DBUS(type), - (char)arg_type); - return; - } - - if (!jack_controller_dbus_to_jack_variant( - arg_type, - arg_ptr, - &value)) - { - jack_dbus_error( - call, - JACK_DBUS_ERROR_INVALID_ARGS, - "Cannot convert parameter value"); - return; - } - - jackctl_parameter_set_value(parameter, &value); - - jack_controller_settings_save_auto(controller_ptr); - - jack_dbus_construct_method_return_empty(call); -} - -static -void -jack_controller_set_parameter_value_engine_driver( - struct jack_dbus_method_call * call, - message_arg_t * arg_ptr, - int arg_type) -{ - union jackctl_parameter_value value; - - if (arg_type != DBUS_TYPE_STRING) + param_ptr = jack_params_get_parameter(controller_ptr->params, address); + if (param_ptr == NULL) { jack_dbus_error( call, JACK_DBUS_ERROR_INVALID_ARGS, - "Engine parameter value type mismatch: was expecting '%c', got '%c'", - (char)DBUS_TYPE_STRING, - (char)arg_type); - return; - } - - if (!jack_controller_dbus_to_jack_variant( - arg_type, - arg_ptr, - &value)) - { - jack_dbus_error( - call, - JACK_DBUS_ERROR_INVALID_ARGS, - "Cannot convert engine parameter value"); + "Invalid container address '%s':'%s':'%s' supplied to method '%s'.", + address[0], + address[1], + address[2], + call->method_name); return; } - if (!jack_controller_select_driver(controller_ptr, value.str)) - { - /* Couldn't find driver with the specified name. */ - jack_dbus_error( - call, - JACK_DBUS_ERROR_UNKNOWN_DRIVER, - "Unknown driver '%s'", - value.str); - return; - } + jackctl_default_value = param_ptr->vtable.get_default_value(param_ptr->obj); + jackctl_value = param_ptr->vtable.get_value(param_ptr->obj); - jack_controller_settings_save_auto(controller_ptr); + jack_controller_jack_to_dbus_variant(param_ptr->type, &jackctl_value, &value); + jack_controller_jack_to_dbus_variant(param_ptr->type, &jackctl_default_value, &default_value); - jack_dbus_construct_method_return_empty(call); + /* Construct the reply. */ + jack_dbus_construct_method_return_parameter( + call, + (dbus_bool_t)(param_ptr->vtable.is_set(param_ptr->obj) ? TRUE : FALSE), + PARAM_TYPE_JACK_TO_DBUS(param_ptr->type), + PARAM_TYPE_JACK_TO_DBUS_SIGNATURE(param_ptr->type), + default_value, + value); } static @@ -1748,14 +816,13 @@ void jack_controller_dbus_set_parameter_value( struct jack_dbus_method_call * call) { - const char * address[3]; + const char * address[PARAM_ADDRESS_SIZE]; + const struct jack_parameter * param_ptr; DBusMessageIter iter; DBusMessageIter variant_iter; message_arg_t arg; int arg_type; - jackctl_internal_t * internal; - jackctl_driver_t * driver; - jackctl_parameter_t * parameter; + union jackctl_parameter_value value; //jack_info("jack_controller_dbus_set_parameter_value() called"); @@ -1769,6 +836,20 @@ jack_controller_dbus_set_parameter_value( //jack_info("address is '%s':'%s':'%s'", address[0], address[1], address[2]); + param_ptr = jack_params_get_parameter(controller_ptr->params, address); + if (param_ptr == NULL) + { + jack_dbus_error( + call, + JACK_DBUS_ERROR_INVALID_ARGS, + "Invalid container address '%s':'%s':'%s' supplied to method '%s'.", + address[0], + address[1], + address[2], + call->method_name); + return; + } + dbus_message_iter_next(&iter); if (dbus_message_iter_has_next(&iter)) @@ -1797,166 +878,35 @@ jack_controller_dbus_set_parameter_value( //jack_info("argument of type '%c'", arg_type); - if (address[0] != NULL && - address[1] != NULL && - address[2] == NULL && - strcmp(address[0], PTNODE_ENGINE) == 0) /* engine parameters requested */ - { - if (strcmp(address[1], ENGINE_DRIVER_PARAMETER_NAME) == 0) - { - jack_controller_set_parameter_value_engine_driver(call, &arg, arg_type); - - return; - } - - parameter = jack_controller_find_parameter(jackctl_server_get_parameters(controller_ptr->server), address[1]); - if (parameter == NULL) - { - jack_dbus_error( - call, - JACK_DBUS_ERROR_UNKNOWN_PARAMETER, - "Unknown engine parameter '%s'", - address[1]); - return; - } - - jack_controller_set_parameter_value(call, parameter, &arg, arg_type); - - return; - } - - if (address[0] != NULL && - address[1] != NULL && - address[2] == NULL && - strcmp(address[0], PTNODE_DRIVER) == 0) /* current driver parameters requested */ - { - parameter = jack_controller_find_parameter(jackctl_driver_get_parameters(controller_ptr->driver), address[1]); - if (parameter == NULL) - { - jack_dbus_error( - call, - JACK_DBUS_ERROR_UNKNOWN_PARAMETER, - "Unknown parameter '%s' for driver '%s'", - address[1], - jackctl_driver_get_name(controller_ptr->driver)); - return; - } - - jack_controller_set_parameter_value(call, parameter, &arg, arg_type); - - return; - } - - if (address[0] != NULL && - address[1] != NULL && - address[2] != NULL && - strcmp(address[0], PTNODE_DRIVERS) == 0) - { - driver = jack_controller_find_driver(controller_ptr->server, address[1]); - if (driver == NULL) - { - jack_dbus_error( - call, - JACK_DBUS_ERROR_UNKNOWN_INTERNAL, - "Unknown driver '%s'", - address[1]); - return; - } - - parameter = jack_controller_find_parameter(jackctl_driver_get_parameters(driver), address[2]); - if (parameter == NULL) - { - jack_dbus_error( - call, - JACK_DBUS_ERROR_UNKNOWN_PARAMETER, - "Unknown parameter '%s' for driver '%s'", - address[2], - address[1]); - return; - } - - jack_controller_set_parameter_value(call, parameter, &arg, arg_type); - - return; - } - - if (address[0] != NULL && - address[1] != NULL && - address[2] != NULL && - strcmp(address[0], PTNODE_INTERNALS) == 0) + if (PARAM_TYPE_JACK_TO_DBUS(param_ptr->type) != arg_type) { - internal = jack_controller_find_internal(controller_ptr->server, address[1]); - if (internal == NULL) - { - jack_dbus_error( - call, - JACK_DBUS_ERROR_UNKNOWN_INTERNAL, - "Unknown internal '%s'", - address[1]); - return; - } - - parameter = jack_controller_find_parameter(jackctl_internal_get_parameters(internal), address[2]); - if (parameter == NULL) - { - jack_dbus_error( - call, - JACK_DBUS_ERROR_UNKNOWN_PARAMETER, - "Unknown parameter '%s' for internal '%s'", - address[2], - address[1]); - return; - } - - jack_controller_set_parameter_value(call, parameter, &arg, arg_type); - + jack_dbus_error( + call, + JACK_DBUS_ERROR_INVALID_ARGS, + "Parameter value type mismatch: was expecting '%c', got '%c'", + (char)PARAM_TYPE_JACK_TO_DBUS(param_ptr->type), + (char)arg_type); return; } - jack_dbus_error( - call, - JACK_DBUS_ERROR_INVALID_ARGS, - "Invalid container address '%s':'%s':'%s' supplied to method '%s'.", - address[0], - address[1], - address[2], - call->method_name); -} - -static -void -jack_controller_reset_parameter_value( - struct jack_dbus_method_call * call, - jackctl_parameter_t * parameter) -{ - jackctl_parameter_reset(parameter); - - jack_controller_settings_save_auto(controller_ptr); - - jack_dbus_construct_method_return_empty(call); -} - -static -void -jack_controller_reset_parameter_value_engine_driver( - struct jack_dbus_method_call * call) -{ - if (!jack_controller_select_driver(controller_ptr, DEFAULT_DRIVER)) + if (!jack_controller_dbus_to_jack_variant( + arg_type, + &arg, + &value)) { - /* Couldn't find driver with the specified name. */ jack_dbus_error( call, - JACK_DBUS_ERROR_UNKNOWN_DRIVER, - "Default driver '%s' is unknown", - DEFAULT_DRIVER); + JACK_DBUS_ERROR_INVALID_ARGS, + "Cannot convert parameter value"); return; } - controller_ptr->driver_set = false; + param_ptr->vtable.set_value(param_ptr->obj, &value); jack_controller_settings_save_auto(controller_ptr); jack_dbus_construct_method_return_empty(call); + } static @@ -1964,10 +914,8 @@ void jack_controller_dbus_reset_parameter_value( struct jack_dbus_method_call * call) { - const char * address[3]; - jackctl_internal_t * internal; - jackctl_driver_t * driver; - jackctl_parameter_t * parameter; + const char * address[PARAM_ADDRESS_SIZE]; + const struct jack_parameter * param_ptr; //jack_info("jack_controller_dbus_reset_parameter_value() called"); @@ -1981,130 +929,25 @@ jack_controller_dbus_reset_parameter_value( //jack_info("address is '%s':'%s':'%s'", address[0], address[1], address[2]); - if (address[0] != NULL && - address[1] != NULL && - address[2] == NULL && - strcmp(address[0], PTNODE_ENGINE) == 0) /* engine parameters requested */ - { - if (strcmp(address[1], ENGINE_DRIVER_PARAMETER_NAME) == 0) - { - jack_controller_reset_parameter_value_engine_driver(call); - - return; - } - - parameter = jack_controller_find_parameter(jackctl_server_get_parameters(controller_ptr->server), address[1]); - if (parameter == NULL) - { - jack_dbus_error( - call, - JACK_DBUS_ERROR_UNKNOWN_PARAMETER, - "Unknown engine parameter '%s'", - address[1]); - return; - } - - jack_controller_reset_parameter_value(call, parameter); - - return; - } - - if (address[0] != NULL && - address[1] != NULL && - address[2] == NULL && - strcmp(address[0], PTNODE_DRIVER) == 0) /* current driver parameters requested */ - { - parameter = jack_controller_find_parameter(jackctl_driver_get_parameters(controller_ptr->driver), address[1]); - if (parameter == NULL) - { - jack_dbus_error( - call, - JACK_DBUS_ERROR_UNKNOWN_PARAMETER, - "Unknown parameter '%s' for driver '%s'", - address[1], - jackctl_driver_get_name(controller_ptr->driver)); - return; - } - - jack_controller_reset_parameter_value(call, parameter); - - return; - } - - if (address[0] != NULL && - address[1] != NULL && - address[2] != NULL && - strcmp(address[0], PTNODE_DRIVERS) == 0) + param_ptr = jack_params_get_parameter(controller_ptr->params, address); + if (param_ptr == NULL) { - driver = jack_controller_find_driver(controller_ptr->server, address[1]); - if (driver == NULL) - { - jack_dbus_error( - call, - JACK_DBUS_ERROR_UNKNOWN_INTERNAL, - "Unknown driver '%s'", - address[1]); - return; - } - - parameter = jack_controller_find_parameter(jackctl_driver_get_parameters(driver), address[2]); - if (parameter == NULL) - { - jack_dbus_error( - call, - JACK_DBUS_ERROR_UNKNOWN_PARAMETER, - "Unknown parameter '%s' for driver '%s'", - address[2], - address[1]); - return; - } - - jack_controller_reset_parameter_value(call, parameter); - + jack_dbus_error( + call, + JACK_DBUS_ERROR_INVALID_ARGS, + "Invalid container address '%s':'%s':'%s' supplied to method '%s'.", + address[0], + address[1], + address[2], + call->method_name); return; } - if (address[0] != NULL && - address[1] != NULL && - address[2] != NULL && - strcmp(address[0], PTNODE_INTERNALS) == 0) - { - internal = jack_controller_find_internal(controller_ptr->server, address[1]); - if (internal == NULL) - { - jack_dbus_error( - call, - JACK_DBUS_ERROR_UNKNOWN_INTERNAL, - "Unknown internal '%s'", - address[1]); - return; - } + param_ptr->vtable.reset(param_ptr->obj); - parameter = jack_controller_find_parameter(jackctl_internal_get_parameters(internal), address[2]); - if (parameter == NULL) - { - jack_dbus_error( - call, - JACK_DBUS_ERROR_UNKNOWN_PARAMETER, - "Unknown parameter '%s' for internal '%s'", - address[2], - address[1]); - return; - } - - jack_controller_reset_parameter_value(call, parameter); - - return; - } + jack_controller_settings_save_auto(controller_ptr); - jack_dbus_error( - call, - JACK_DBUS_ERROR_INVALID_ARGS, - "Invalid container address '%s':'%s':'%s' supplied to method '%s'.", - address[0], - address[1], - address[2], - call->method_name); + jack_dbus_construct_method_return_empty(call); } #undef controller_ptr diff --git a/dbus/controller_internal.h b/dbus/controller_internal.h index 6bb223a8..ae247c39 100644 --- a/dbus/controller_internal.h +++ b/dbus/controller_internal.h @@ -1,6 +1,6 @@ /* -*- Mode: C ; c-basic-offset: 4 -*- */ /* - Copyright (C) 2007,2008 Nedko Arnaudov + Copyright (C) 2007,2008,2011 Nedko Arnaudov Copyright (C) 2007-2008 Juuso Alasuutari This program is free software; you can redistribute it and/or modify @@ -27,6 +27,7 @@ #include "jack/jack.h" #include "jackdbus.h" #include "list.h" +#include "params.h" struct jack_controller_slave_driver { @@ -38,6 +39,7 @@ struct jack_controller_slave_driver struct jack_controller { jackctl_server_t *server; + jack_params_handle params; void *patchbay_context; @@ -45,14 +47,6 @@ struct jack_controller jack_client_t *client; unsigned int xruns; - const char **driver_names; - unsigned int drivers_count; - - const char **internal_names; - unsigned int internals_count; - - jackctl_driver_t *driver; - bool driver_set; /* whether driver is manually set, if false - DEFAULT_DRIVER is auto set */ struct list_head slave_drivers; struct jack_dbus_object_descriptor dbus_descriptor; @@ -121,47 +115,15 @@ jack_controller_unload_internal( const char * internal_name); void -jack_controller_settings_set_driver_option( - jackctl_driver_t *driver, - const char *option_name, - const char *option_value); - -void -jack_controller_settings_set_internal_option( - jackctl_internal_t *internal, - const char *option_name, - const char *option_value); - -void -jack_controller_settings_set_engine_option( +jack_controller_deserialize_parameter_value( struct jack_controller *controller_ptr, - const char *option_name, - const char *option_value); - -bool -jack_controller_settings_save_engine_options( - void *context, - struct jack_controller *controller_ptr, - void *dbus_call_context_ptr); + const char * const * address, + const char * value); -bool -jack_controller_settings_write_option( - void *context, - const char *name, - const char *content, - void *dbus_call_context_ptr); - -bool -jack_controller_settings_save_driver_options( - void *context, - jackctl_driver_t *driver, - void *dbus_call_context_ptr); - -bool -jack_controller_settings_save_internal_options( - void *context, - jackctl_internal_t *internal, - void *dbus_call_context_ptr); +void +jack_controller_serialize_parameter_value( + const struct jack_parameter * param_ptr, + char * value_buffer); bool jack_controller_patchbay_init( diff --git a/dbus/params.c b/dbus/params.c new file mode 100644 index 00000000..b6f913de --- /dev/null +++ b/dbus/params.c @@ -0,0 +1,717 @@ +/* -*- Mode: C ; c-basic-offset: 4 -*- */ +/* + Copyright (C) 2011 Nedko Arnaudov + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +/* + * Parameter addresses: + * + * "engine" + * "engine", "driver" + * "engine", "realtime" + * "engine", ...more engine parameters + * + * "driver", "device" + * "driver", ...more driver parameters + * + * "drivers", "alsa", "device" + * "drivers", "alsa", ...more alsa driver parameters + * + * "drivers", ...more drivers + * + * "internals", "netmanager", "multicast_ip" + * "internals", "netmanager", ...more netmanager parameters + * + * "internals", ...more internals + * + */ + +#include +#include +#include +#include + +#include "params.h" +#include "controller_internal.h" + +#define PTNODE_ENGINE "engine" +#define PTNODE_DRIVER "driver" +#define PTNODE_DRIVERS "drivers" +#define PTNODE_INTERNALS "internals" + +struct jack_parameter_container +{ + struct list_head siblings; + char * name; + struct jack_parameter_container * symlink; + bool leaf; + struct list_head children; + void * obj; +}; + +struct jack_params +{ + jackctl_server_t * server; + struct jack_parameter_container root; + struct list_head * drivers_ptr; + uint32_t drivers_count; + struct jack_parameter_container * driver_ptr; + bool driver_set; /* whether driver is manually set, if false - DEFAULT_DRIVER is auto set */ +}; + +static bool controlapi_parameter_is_set(void * obj) +{ + return jackctl_parameter_is_set((jackctl_parameter_t *)obj); +} + +static bool controlapi_parameter_reset(void * obj) +{ + return jackctl_parameter_reset((jackctl_parameter_t *)obj); +} + +union jackctl_parameter_value controlapi_parameter_get_value(void * obj) +{ + return jackctl_parameter_get_value((jackctl_parameter_t *)obj); +} + +bool controlapi_parameter_set_value(void * obj, const union jackctl_parameter_value * value_ptr) +{ + return jackctl_parameter_set_value((jackctl_parameter_t *)obj, value_ptr); +} + +union jackctl_parameter_value controlapi_parameter_get_default_value(void * obj) +{ + return jackctl_parameter_get_default_value((jackctl_parameter_t *)obj); +} + +static struct jack_parameter_container * create_container(struct list_head * parent_list_ptr, const char * name) +{ + struct jack_parameter_container * container_ptr; + + container_ptr = malloc(sizeof(struct jack_parameter_container)); + if (container_ptr == NULL) + { + jack_error("Ran out of memory trying to allocate struct jack_parameter_container"); + goto fail; + } + + container_ptr->name = strdup(name); + if (container_ptr->name == NULL) + { + jack_error("Ran out of memory trying to strdup parameter container name"); + goto free; + } + + container_ptr->leaf = false; + container_ptr->symlink = NULL; + container_ptr->obj = NULL; + INIT_LIST_HEAD(&container_ptr->children); + list_add_tail(&container_ptr->siblings, parent_list_ptr); + + return container_ptr; + +free: + free(container_ptr); +fail: + return NULL; +} + +static bool add_controlapi_param(struct list_head * parent_list_ptr, jackctl_parameter_t * param) +{ + struct jack_parameter * param_ptr; + uint32_t i; + + param_ptr = malloc(sizeof(struct jack_parameter)); + if (param_ptr == NULL) + { + jack_error("Ran out of memory trying to allocate struct jack_parameter"); + goto fail; + } + + param_ptr->obj = param; + param_ptr->vtable.is_set = controlapi_parameter_is_set; + param_ptr->vtable.reset = controlapi_parameter_reset; + param_ptr->vtable.get_value = controlapi_parameter_get_value; + param_ptr->vtable.set_value = controlapi_parameter_set_value; + param_ptr->vtable.get_default_value = controlapi_parameter_get_default_value; + + param_ptr->type = jackctl_parameter_get_type(param); + param_ptr->name = jackctl_parameter_get_name(param); + param_ptr->short_decr = jackctl_parameter_get_short_description(param); + param_ptr->long_descr = jackctl_parameter_get_long_description(param); + + if (jackctl_parameter_has_range_constraint(param)) + { + param_ptr->constraint_flags = JACK_CONSTRAINT_FLAG_VALID; + param_ptr->constraint_range = true; + jackctl_parameter_get_range_constraint(param, ¶m_ptr->constraint.range.min, ¶m_ptr->constraint.range.max); + } + else if (jackctl_parameter_has_enum_constraint(param)) + { + param_ptr->constraint_flags = JACK_CONSTRAINT_FLAG_VALID; + param_ptr->constraint_range = false; + param_ptr->constraint.enumeration.count = jackctl_parameter_get_enum_constraints_count(param); + param_ptr->constraint.enumeration.possible_values_array = malloc(sizeof(struct jack_parameter_enum) * param_ptr->constraint.enumeration.count); + if (param_ptr->constraint.enumeration.possible_values_array == NULL) + { + goto free; + } + + for (i = 0; i < param_ptr->constraint.enumeration.count; i++) + { + param_ptr->constraint.enumeration.possible_values_array[i].value = jackctl_parameter_get_enum_constraint_value(param, i); + param_ptr->constraint.enumeration.possible_values_array[i].short_desc = jackctl_parameter_get_enum_constraint_description(param, i); + } + } + else + { + param_ptr->constraint_flags = 0; + goto add; + } + + if (jackctl_parameter_constraint_is_strict(param)) + { + param_ptr->constraint_flags |= JACK_CONSTRAINT_FLAG_STRICT; + } + + if (jackctl_parameter_constraint_is_fake_value(param)) + { + param_ptr->constraint_flags |= JACK_CONSTRAINT_FLAG_FAKE_VALUE; + } + +add: + list_add_tail(¶m_ptr->siblings, parent_list_ptr); + return true; + +free: + free(param_ptr); +fail: + return false; +} + +static void free_params(struct list_head * parent_list_ptr) +{ + struct jack_parameter * param_ptr; + + while (!list_empty(parent_list_ptr)) + { + param_ptr = list_entry(parent_list_ptr->next, struct jack_parameter, siblings); + list_del(¶m_ptr->siblings); + + if ((param_ptr->constraint_flags & JACK_CONSTRAINT_FLAG_VALID) != 0 && + !param_ptr->constraint_range && + param_ptr->constraint.enumeration.possible_values_array != NULL) + { + free(param_ptr->constraint.enumeration.possible_values_array); + } + + free(param_ptr); + } +} + +static void free_containers(struct list_head * parent_list_ptr) +{ + struct jack_parameter_container * container_ptr; + + while (!list_empty(parent_list_ptr)) + { + container_ptr = list_entry(parent_list_ptr->next, struct jack_parameter_container, siblings); + list_del(&container_ptr->siblings); + + if (container_ptr->leaf) + { + free_params(&container_ptr->children); + } + else + { + free_containers(&container_ptr->children); + } + + free(container_ptr->name); + free(container_ptr); + } +} + +static struct jack_parameter_container * find_container(struct jack_parameter_container * parent_ptr, const char * const * address, int max_depth) +{ + struct list_head * node_ptr; + struct jack_parameter_container * container_ptr; + + if (max_depth == 0 || *address == NULL) + { + return parent_ptr; + } + + if (parent_ptr->leaf) + { + return NULL; + } + + if (max_depth > 0) + { + max_depth--; + } + + list_for_each(node_ptr, &parent_ptr->children) + { + container_ptr = list_entry(node_ptr, struct jack_parameter_container, siblings); + if (strcmp(container_ptr->name, *address) == 0) + { + if (container_ptr->symlink != NULL) + { + container_ptr = container_ptr->symlink; + } + + return find_container(container_ptr, address + 1, max_depth); + } + } + + return NULL; +} + +static bool init_leaf(struct list_head * parent_list_ptr, const char * name, const JSList * params_list, void * obj) +{ + struct jack_parameter_container * container_ptr; + + container_ptr = create_container(parent_list_ptr, name); + if (container_ptr == NULL) + { + return false; + } + + container_ptr->leaf = true; + container_ptr->obj = obj; + + while (params_list) + { + if (!add_controlapi_param(&container_ptr->children, params_list->data)) + { + return false; + } + + params_list = jack_slist_next(params_list); + } + + return true; +} + +static bool init_engine(struct jack_params * params_ptr) +{ + return init_leaf(¶ms_ptr->root.children, PTNODE_ENGINE, jackctl_server_get_parameters(params_ptr->server), NULL); +} + +static bool init_drivers(struct jack_params * params_ptr) +{ + const JSList * list; + struct jack_parameter_container * container_ptr; + + container_ptr = create_container(¶ms_ptr->root.children, PTNODE_DRIVERS); + if (container_ptr == NULL) + { + return false; + } + + params_ptr->drivers_ptr = &container_ptr->children; + params_ptr->drivers_count = 0; + + list = jackctl_server_get_drivers_list(params_ptr->server); + while (list) + { + if (!init_leaf(&container_ptr->children, jackctl_driver_get_name(list->data), jackctl_driver_get_parameters(list->data), list->data)) + { + return false; + } + + params_ptr->drivers_count++; + + list = jack_slist_next(list); + } + + return true; +} + +static bool init_internals(struct jack_params * params_ptr) +{ + const JSList * list; + struct jack_parameter_container * container_ptr; + + container_ptr = create_container(¶ms_ptr->root.children, PTNODE_INTERNALS); + if (container_ptr == NULL) + { + return false; + } + + list = jackctl_server_get_internals_list(params_ptr->server); + while (list) + { + if (!init_leaf(&container_ptr->children, jackctl_internal_get_name(list->data), jackctl_internal_get_parameters(list->data), NULL)) + { + return false; + } + + list = jack_slist_next(list); + } + + return true; +} + +static bool init_driver(struct jack_params * params_ptr) +{ + struct jack_parameter_container * container_ptr; + + container_ptr = create_container(¶ms_ptr->root.children, PTNODE_DRIVER); + if (container_ptr == NULL) + { + return false; + } + + params_ptr->driver_ptr = container_ptr; + + return true; +} + +#define params_ptr ((struct jack_params *)obj) + +static bool engine_driver_parameter_is_set(void * obj) +{ + return params_ptr->driver_set; +} + +static bool engine_driver_parameter_reset(void * obj) +{ + if (!jack_params_set_driver(obj, DEFAULT_DRIVER)) + { + return false; + } + + params_ptr->driver_set = false; + + return true; +} + +union jackctl_parameter_value engine_driver_parameter_get_value(void * obj) +{ + union jackctl_parameter_value value; + + strcpy(value.str, params_ptr->driver_ptr->symlink->name); + + return value; +} + +bool engine_driver_parameter_set_value(void * obj, const union jackctl_parameter_value * value_ptr) +{ + return jack_params_set_driver(obj, value_ptr->str); +} + +union jackctl_parameter_value engine_driver_parameter_get_default_value(void * obj) +{ + union jackctl_parameter_value value; + + strcpy(value.str, DEFAULT_DRIVER); + + return value; +} + +#undef params_ptr + +static bool add_engine_driver_enum_constraint(void * context, const char * name) +{ + strcpy((*((struct jack_parameter_enum **)context))->value.str, name); + (*((struct jack_parameter_enum **)context))->short_desc = name; + (*((struct jack_parameter_enum **)context))++; + return true; +} + +static bool init_engine_driver_parameter(struct jack_params * params_ptr) +{ + struct jack_parameter * param_ptr; + const char * address[PARAM_ADDRESS_SIZE] = {PTNODE_ENGINE, NULL}; + struct jack_parameter_container * engine_ptr; + struct jack_parameter_enum * possible_value; + + engine_ptr = find_container(¶ms_ptr->root, address, PARAM_ADDRESS_SIZE); + if (engine_ptr == NULL) + { + return false; + } + + param_ptr = malloc(sizeof(struct jack_parameter)); + if (param_ptr == NULL) + { + jack_error("Ran out of memory trying to allocate struct jack_parameter"); + goto fail; + } + + param_ptr->obj = params_ptr; + param_ptr->vtable.is_set = engine_driver_parameter_is_set; + param_ptr->vtable.reset = engine_driver_parameter_reset; + param_ptr->vtable.get_value = engine_driver_parameter_get_value; + param_ptr->vtable.set_value = engine_driver_parameter_set_value; + param_ptr->vtable.get_default_value = engine_driver_parameter_get_default_value; + + param_ptr->type = JackParamString; + param_ptr->name = "driver"; + param_ptr->short_decr = "Driver to use"; + param_ptr->long_descr = ""; + + param_ptr->constraint_flags = JACK_CONSTRAINT_FLAG_VALID | JACK_CONSTRAINT_FLAG_STRICT | JACK_CONSTRAINT_FLAG_FAKE_VALUE; + param_ptr->constraint_range = false; + param_ptr->constraint.enumeration.count = params_ptr->drivers_count; + param_ptr->constraint.enumeration.possible_values_array = malloc(sizeof(struct jack_parameter_enum) * params_ptr->drivers_count); + if (param_ptr->constraint.enumeration.possible_values_array == NULL) + { + goto free; + } + + address[0] = PTNODE_DRIVERS; + possible_value = param_ptr->constraint.enumeration.possible_values_array; + jack_params_iterate_container((jack_params_handle)params_ptr, address, add_engine_driver_enum_constraint, &possible_value); + + list_add(¶m_ptr->siblings, &engine_ptr->children); + return true; + +free: + free(param_ptr); +fail: + return false; +} + +jack_params_handle jack_params_create(jackctl_server_t * server) +{ + struct jack_params * params_ptr; + + params_ptr = malloc(sizeof(struct jack_params)); + if (params_ptr == NULL) + { + jack_error("Ran out of memory trying to allocate struct jack_params"); + return NULL; + } + + params_ptr->server = server; + INIT_LIST_HEAD(¶ms_ptr->root.children); + params_ptr->root.leaf = false; + params_ptr->root.name = NULL; + + if (!init_engine(params_ptr) || + !init_drivers(params_ptr) || + !init_driver(params_ptr) || + !init_engine_driver_parameter(params_ptr) || + !jack_params_set_driver((jack_params_handle)params_ptr, DEFAULT_DRIVER) || + !init_internals(params_ptr)) + { + jack_params_destroy((jack_params_handle)params_ptr); + return NULL; + } + + params_ptr->driver_set = false; + + assert(strcmp(params_ptr->driver_ptr->symlink->name, DEFAULT_DRIVER) == 0); + + return (jack_params_handle)params_ptr; +} + +#define params_ptr ((struct jack_params *)params) + +void jack_params_destroy(jack_params_handle params) +{ + free_containers(¶ms_ptr->root.children); + free(params); +} + +bool jack_params_set_driver(jack_params_handle params, const char * name) +{ + struct list_head * node_ptr; + struct jack_parameter_container * container_ptr; + + list_for_each(node_ptr, params_ptr->drivers_ptr) + { + container_ptr = list_entry(node_ptr, struct jack_parameter_container, siblings); + if (strcmp(container_ptr->name, name) == 0) + { + params_ptr->driver_ptr->symlink = container_ptr; + params_ptr->driver_set = true; + return true; + } + } + + return false; +} + +jackctl_driver_t * jack_params_get_driver(jack_params_handle params) +{ + return params_ptr->driver_ptr->symlink->obj; +} + +bool jack_params_check_address(jack_params_handle params, const char * const * address, bool want_leaf) +{ + struct jack_parameter_container * container_ptr; + + container_ptr = find_container(¶ms_ptr->root, address, PARAM_ADDRESS_SIZE); + if (container_ptr == NULL) + { + return false; + } + + if (want_leaf && !container_ptr->leaf) + { + return false; + } + + return true; +} + +bool jack_params_is_leaf_container(jack_params_handle params, const char * const * address) +{ + struct jack_parameter_container * container_ptr; + + container_ptr = find_container(¶ms_ptr->root, address, PARAM_ADDRESS_SIZE); + if (container_ptr == NULL) + { + assert(false); + return false; + } + + return container_ptr->leaf; +} + +bool +jack_params_iterate_container( + jack_params_handle params, + const char * const * address, + bool (* callback)(void * context, const char * name), + void * context) +{ + struct jack_parameter_container * container_ptr; + struct list_head * node_ptr; + const char * name; + + container_ptr = find_container(¶ms_ptr->root, address, PARAM_ADDRESS_SIZE); + if (container_ptr == NULL) + { + assert(false); + return true; + } + + list_for_each(node_ptr, &container_ptr->children) + { + if (container_ptr->leaf) + { + name = list_entry(node_ptr, struct jack_parameter, siblings)->name; + } + else + { + name = list_entry(node_ptr, struct jack_parameter_container, siblings)->name; + } + + if (!callback(context, name)) + { + return false; + } + } + + return true; +} + +bool +jack_params_iterate_params( + jack_params_handle params, + const char * const * address, + bool (* callback)(void * context, const struct jack_parameter * param_ptr), + void * context) +{ + struct jack_parameter_container * container_ptr; + struct list_head * node_ptr; + struct jack_parameter * param_ptr; + + container_ptr = find_container(¶ms_ptr->root, address, PARAM_ADDRESS_SIZE); + if (container_ptr == NULL || !container_ptr->leaf) + { + assert(false); + return true; + } + + list_for_each(node_ptr, &container_ptr->children) + { + param_ptr = list_entry(node_ptr, struct jack_parameter, siblings); + if (!callback(context, param_ptr)) + { + return false; + } + } + + return true; +} + +const struct jack_parameter * jack_params_get_parameter(jack_params_handle params, const char * const * address) +{ + int depth; + struct jack_parameter_container * container_ptr; + struct list_head * node_ptr; + struct jack_parameter * param_ptr; + + for (depth = 0; depth < PARAM_ADDRESS_SIZE; depth++) + { + if (address[depth] == NULL) + { + break; + } + } + + depth--; + + container_ptr = find_container(¶ms_ptr->root, address, depth); + if (container_ptr == NULL || !container_ptr->leaf) + { + return NULL; + } + + list_for_each(node_ptr, &container_ptr->children) + { + param_ptr = list_entry(node_ptr, struct jack_parameter, siblings); + if (strcmp(param_ptr->name, address[depth]) == 0) + { + return param_ptr; + } + } + + return NULL; +} + +bool jack_params_add_parameter(jack_params_handle params, const char * const * address, bool end, struct jack_parameter * param_ptr) +{ + struct jack_parameter_container * container_ptr; + + container_ptr = find_container(¶ms_ptr->root, address, PARAM_ADDRESS_SIZE); + if (container_ptr == NULL || !container_ptr->leaf) + { + assert(false); + return false; + } + + if (end) + { + list_add_tail(¶m_ptr->siblings, &container_ptr->children); + } + else + { + list_add(¶m_ptr->siblings, &container_ptr->children); + } + + return true; +} + +#undef params_ptr diff --git a/dbus/params.h b/dbus/params.h new file mode 100644 index 00000000..d880a7dd --- /dev/null +++ b/dbus/params.h @@ -0,0 +1,110 @@ +/* -*- Mode: C ; c-basic-offset: 4 -*- */ +/* + Copyright (C) 2011 Nedko Arnaudov + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#ifndef PARAMS_H__A23EDE06_C1C9_4489_B253_FD1B26B66929__INCLUDED +#define PARAMS_H__A23EDE06_C1C9_4489_B253_FD1B26B66929__INCLUDED + +#include "jack/control.h" +#include "list.h" + +#define PARAM_ADDRESS_SIZE 3 + +#define PTNODE_ENGINE "engine" +#define PTNODE_DRIVER "driver" +#define PTNODE_DRIVERS "drivers" +#define PTNODE_INTERNALS "internals" + +struct jack_parameter_vtable +{ + bool (* is_set)(void * obj); + bool (* reset)(void * obj); + union jackctl_parameter_value (* get_value)(void * obj); + bool (* set_value)(void * obj, const union jackctl_parameter_value * value_ptr); + union jackctl_parameter_value (* get_default_value)(void * obj); +}; + +#define JACK_CONSTRAINT_FLAG_VALID ((uint32_t)1) /**< if not set, there is no constraint */ +#define JACK_CONSTRAINT_FLAG_STRICT ((uint32_t)2) /**< if set, constraint is strict, i.e. supplying non-matching value will not work */ +#define JACK_CONSTRAINT_FLAG_FAKE_VALUE ((uint32_t)4) /**< if set, values have no user meaningful meaning */ + +struct jack_parameter_enum +{ + union jackctl_parameter_value value; + const char * short_desc; +}; + +struct jack_parameter +{ + void * obj; + struct jack_parameter_vtable vtable; + struct list_head siblings; + jackctl_param_type_t type; + const char * name; + const char * short_decr; + const char * long_descr; + + uint32_t constraint_flags; /**< JACK_CONSTRAINT_FLAG_XXX */ + bool constraint_range; /**< if true, constraint is a range (min-max), otherwise it is an enumeration */ + + union + { + struct + { + union jackctl_parameter_value min; + union jackctl_parameter_value max; + } range; /**< valid when JACK_CONSTRAINT_FLAG_RANGE flag is set */ + + struct + { + uint32_t count; + struct jack_parameter_enum * possible_values_array; + } enumeration; /**< valid when JACK_CONSTRAINT_FLAG_RANGE flag is not set */ + } constraint; +}; + +typedef struct _jack_params { int unused; } * jack_params_handle; + +jack_params_handle jack_params_create(jackctl_server_t * server); +void jack_params_destroy(jack_params_handle params); + +bool jack_params_set_driver(jack_params_handle params, const char * name); +jackctl_driver_t * jack_params_get_driver(jack_params_handle params); + +bool jack_params_check_address(jack_params_handle params, const char * const * address, bool want_leaf); +bool jack_params_is_leaf_container(jack_params_handle params, const char * const * address); + +bool +jack_params_iterate_container( + jack_params_handle params, + const char * const * address, + bool (* callback)(void * context, const char * name), + void * context); + +bool +jack_params_iterate_params( + jack_params_handle params, + const char * const * address, + bool (* callback)(void * context, const struct jack_parameter * param_ptr), + void * context); + +const struct jack_parameter * jack_params_get_parameter(jack_params_handle params, const char * const * address); + +bool jack_params_add_parameter(jack_params_handle params, const char * const * address, bool end, struct jack_parameter * param_ptr); + +#endif /* #ifndef PARAMS_H__A23EDE06_C1C9_4489_B253_FD1B26B66929__INCLUDED */ diff --git a/dbus/wscript b/dbus/wscript index 6aa716d2..2045c33f 100644 --- a/dbus/wscript +++ b/dbus/wscript @@ -52,6 +52,7 @@ def build(bld): obj.source = [ 'jackdbus.c', 'controller.c', + 'params.c', 'controller_iface_configure.c', 'controller_iface_control.c', 'controller_iface_introspectable.c', diff --git a/dbus/xml.c b/dbus/xml.c index b506c5d5..c7e11377 100644 --- a/dbus/xml.c +++ b/dbus/xml.c @@ -1,6 +1,6 @@ /* -*- Mode: C ; c-basic-offset: 4 -*- */ /* - Copyright (C) 2007,2008 Nedko Arnaudov + Copyright (C) 2007,2008,2011 Nedko Arnaudov This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -25,358 +25,116 @@ #include #include #include +#include #include #include "controller_internal.h" void -jack_controller_settings_set_bool_option( - const char *value_str, - int *value_ptr) -{ - if (strcmp(value_str, "true") == 0) - { - *value_ptr = true; - } - else if (strcmp(value_str, "false") == 0) - { - *value_ptr = false; - } - else - { - jack_error("ignoring unknown bool value \"%s\"", value_str); - } -} - -void -jack_controller_settings_set_sint_option( - const char *value_str, - int *value_ptr) -{ - *value_ptr = atoi(value_str); -} - -void -jack_controller_settings_set_uint_option( - const char *value_str, - unsigned int *value_ptr) -{ - *value_ptr = strtoul(value_str, NULL, 10); -} - -void -jack_controller_settings_set_char_option( - const char *value_str, - char *value_ptr) -{ - if (value_str[0] == 0 || value_str[1] != 0) - { - jack_error("invalid char option value \"%s\"", value_str); - return; - } - - *value_ptr = *value_str; -} - -void -jack_controller_settings_set_string_option( - const char *value_str, - char *value_ptr, - size_t max_size) -{ - size_t size; - - size = strlen(value_str); - - if (size >= max_size) - { - jack_error("string option value \"%s\" is too long, max is %u chars (including terminating zero)", value_str, (unsigned int)max_size); - return; - } - - strcpy(value_ptr, value_str); -} - -void -jack_controller_settings_set_driver_option( - jackctl_driver_t *driver, - const char *option_name, - const char *option_value) +jack_controller_deserialize_parameter_value( + struct jack_controller *controller_ptr, + const char * const * address, + const char * option_value) { - jackctl_parameter_t *parameter; - jackctl_param_type_t type; - int value_int = 0; - unsigned int value_uint = 0; + const struct jack_parameter * param_ptr; union jackctl_parameter_value value; + size_t size; - jack_info("setting driver option \"%s\" to value \"%s\"", option_name, option_value); - - parameter = jack_controller_find_parameter(jackctl_driver_get_parameters(driver), option_name); - if (parameter == NULL) + param_ptr = jack_params_get_parameter(controller_ptr->params, address); + if (param_ptr == NULL) { - jack_error( - "Unknown parameter \"%s\" of driver \"%s\"", - option_name, - jackctl_driver_get_name(driver)); - return; + jack_error("Unknown parameter"); + goto ignore; } - type = jackctl_parameter_get_type(parameter); + jack_info("setting parameter '%s':'%s':'%s' to value \"%s\"", address[0], address[1], address[2], option_value); - switch (type) + switch (param_ptr->type) { case JackParamInt: - jack_controller_settings_set_sint_option(option_value, &value_int); - value.i = value_int; + value.i = atoi(option_value); break; case JackParamUInt: - jack_controller_settings_set_uint_option(option_value, &value_uint); - value.ui = value_uint; + value.ui = strtoul(option_value, NULL, 10); break; case JackParamChar: - jack_controller_settings_set_char_option(option_value, &value.c); + if (option_value[0] == 0 || option_value[1] != 0) + { + jack_error("invalid char option value \"%s\"", option_value); + goto ignore; + } + value.c = *option_value; break; case JackParamString: - jack_controller_settings_set_string_option(option_value, value.str, sizeof(value.str)); + size = strlen(option_value); + if (size >= sizeof(value.str)) + { + jack_error("string option value \"%s\" is too long, max is %zu chars (including terminating zero)", option_value, sizeof(value.str)); + goto ignore; + } + + strcpy(value.str, option_value); break; case JackParamBool: - jack_controller_settings_set_bool_option(option_value, &value_int); - value.i = value_int; + if (strcmp(option_value, "true") == 0) + { + value.b = true; + } + else if (strcmp(option_value, "false") == 0) + { + value.b = false; + } + else + { + jack_error("ignoring unknown bool value \"%s\"", option_value); + goto ignore; + } break; default: - jack_error("Parameter \"%s\" of driver \"%s\" is of unknown type %d", - jackctl_parameter_get_name(parameter), - jackctl_driver_get_name(driver), - type); + jack_error("Unknown type %d", (int)param_ptr->type); + goto ignore; } - jackctl_parameter_set_value(parameter, &value); -} - -void -jack_controller_settings_set_internal_option( - jackctl_internal_t *internal, - const char *option_name, - const char *option_value) -{ - jackctl_parameter_t *parameter; - jackctl_param_type_t type; - int value_int = 0; - unsigned int value_uint = 0; - union jackctl_parameter_value value; - - jack_info("setting internal option \"%s\" to value \"%s\"", option_name, option_value); - - parameter = jack_controller_find_parameter(jackctl_internal_get_parameters(internal), option_name); - if (parameter == NULL) + if (param_ptr->vtable.set_value(param_ptr->obj, &value)) { - jack_error( - "Unknown parameter \"%s\" of internal \"%s\"", - option_name, - jackctl_internal_get_name(internal)); return; } - type = jackctl_parameter_get_type(parameter); - - switch (type) - { - case JackParamInt: - jack_controller_settings_set_sint_option(option_value, &value_int); - value.i = value_int; - break; - case JackParamUInt: - jack_controller_settings_set_uint_option(option_value, &value_uint); - value.ui = value_uint; - break; - case JackParamChar: - jack_controller_settings_set_char_option(option_value, &value.c); - break; - case JackParamString: - jack_controller_settings_set_string_option(option_value, value.str, sizeof(value.str)); - break; - case JackParamBool: - jack_controller_settings_set_bool_option(option_value, &value_int); - value.i = value_int; - break; - default: - jack_error("Parameter \"%s\" of internal \"%s\" is of unknown type %d", - jackctl_parameter_get_name(parameter), - jackctl_internal_get_name(internal), - type); - } + jack_error("Parameter set failed"); - jackctl_parameter_set_value(parameter, &value); +ignore: + jack_error("Ignoring restore attempt of parameter '%s':'%s':'%s'", address[0], address[1], address[2]); } void -jack_controller_settings_set_engine_option( - struct jack_controller *controller_ptr, - const char *option_name, - const char *option_value) +jack_controller_serialize_parameter_value( + const struct jack_parameter * param_ptr, + char * value_buffer) { - jackctl_parameter_t *parameter; - jackctl_param_type_t type; - int value_int = 0; - unsigned int value_uint = 0; union jackctl_parameter_value value; - jack_info("setting engine option \"%s\" to value \"%s\"", option_name, option_value); + value = param_ptr->vtable.get_value(param_ptr->obj); - if (strcmp(option_name, "driver") == 0) - { - if (!jack_controller_select_driver(controller_ptr, option_value)) - { - jack_error("unknown driver '%s'", option_value); - } - - return; - } - - parameter = jack_controller_find_parameter(jackctl_server_get_parameters(controller_ptr->server), option_name); - if (parameter == NULL) - { - jack_error( - "Unknown engine parameter \"%s\"", - option_name); - return; - } - - type = jackctl_parameter_get_type(parameter); - - switch (type) + switch (param_ptr->type) { case JackParamInt: - jack_controller_settings_set_sint_option(option_value, &value_int); - value.i = value_int; - break; + sprintf(value_buffer, "%d", (int)value.i); + return; case JackParamUInt: - jack_controller_settings_set_uint_option(option_value, &value_uint); - value.ui = value_uint; - break; + sprintf(value_buffer, "%u", (unsigned int)value.ui); + return; case JackParamChar: - jack_controller_settings_set_char_option(option_value, &value.c); - break; + sprintf(value_buffer, "%c", (char)value.c); + return; case JackParamString: - jack_controller_settings_set_string_option(option_value, value.str, sizeof(value.str)); - break; + strcpy(value_buffer, value.str); + return; case JackParamBool: - jack_controller_settings_set_bool_option(option_value, &value_int); - value.i = value_int; - break; - default: - jack_error("Engine parameter \"%s\" is of unknown type %d", - jackctl_parameter_get_name(parameter), - type); - } - - jackctl_parameter_set_value(parameter, &value); -} - -static -bool -jack_controller_settings_save_options( - void *context, - const JSList * parameters_list, - void *dbus_call_context_ptr) -{ - jackctl_parameter_t *parameter; - jackctl_param_type_t type; - union jackctl_parameter_value value; - const char * name; - char value_str[50]; - - while (parameters_list != NULL) - { - parameter = (jackctl_parameter_t *)parameters_list->data; - - if (jackctl_parameter_is_set(parameter)) - { - type = jackctl_parameter_get_type(parameter); - value = jackctl_parameter_get_value(parameter); - name = jackctl_parameter_get_name(parameter); - - switch (type) - { - case JackParamInt: - sprintf(value_str, "%d", (int)value.i); - if (!jack_controller_settings_write_option(context, name, value_str, dbus_call_context_ptr)) - { - return false; - } - break; - case JackParamUInt: - sprintf(value_str, "%u", (unsigned int)value.ui); - if (!jack_controller_settings_write_option(context, name, value_str, dbus_call_context_ptr)) - { - return false; - } - break; - case JackParamChar: - sprintf(value_str, "%c", (char)value.c); - if (!jack_controller_settings_write_option(context, name, value_str, dbus_call_context_ptr)) - { - return false; - } - break; - case JackParamString: - if (!jack_controller_settings_write_option(context, name, value.str, dbus_call_context_ptr)) - { - return false; - } - break; - case JackParamBool: - if (!jack_controller_settings_write_option(context, name, value.b ? "true" : "false", dbus_call_context_ptr)) - { - return false; - } - break; - default: - jack_error("parameter of unknown type %d", type); - } - } - - parameters_list = jack_slist_next(parameters_list); - } - - return true; -} - -bool -jack_controller_settings_save_engine_options( - void *context, - struct jack_controller *controller_ptr, - void *dbus_call_context_ptr) -{ - if (controller_ptr->driver != NULL) - { - if (!jack_controller_settings_write_option( - context, - "driver", - jackctl_driver_get_name(controller_ptr->driver), - dbus_call_context_ptr)) - { - return false; - } + strcpy(value_buffer, value.b ? "true" : "false"); + return; } - return jack_controller_settings_save_options(context, jackctl_server_get_parameters(controller_ptr->server), dbus_call_context_ptr); -} - -bool -jack_controller_settings_save_driver_options( - void *context, - jackctl_driver_t *driver, - void *dbus_call_context_ptr) -{ - return jack_controller_settings_save_options(context, jackctl_driver_get_parameters(driver), dbus_call_context_ptr); -} - -bool -jack_controller_settings_save_internal_options( - void *context, - jackctl_internal_t *internal, - void *dbus_call_context_ptr) -{ - return jack_controller_settings_save_options(context, jackctl_internal_get_parameters(internal), dbus_call_context_ptr); + jack_error("parameter of unknown type %d", (int)param_ptr->type); + assert(false); + *value_buffer = 0; } diff --git a/dbus/xml_expat.c b/dbus/xml_expat.c index 1ee1bd2e..f5a5aa68 100644 --- a/dbus/xml_expat.c +++ b/dbus/xml_expat.c @@ -1,6 +1,6 @@ /* -*- Mode: C ; c-basic-offset: 4 -*- */ /* - Copyright (C) 2007,2008 Nedko Arnaudov + Copyright (C) 2007,2008,2011 Nedko Arnaudov This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -29,6 +29,7 @@ #include #include #include +#include #include #include @@ -46,27 +47,16 @@ jack_controller_settings_uninit() { } -#define PARSE_CONTEXT_ROOT 0 -#define PARSE_CONTEXT_JACK 1 -#define PARSE_CONTEXT_ENGINE 1 -#define PARSE_CONTEXT_DRIVERS 2 -#define PARSE_CONTEXT_DRIVER 3 -#define PARSE_CONTEXT_OPTION 4 -#define PARSE_CONTEXT_INTERNALS 5 -#define PARSE_CONTEXT_INTERNAL 6 - -#define MAX_STACK_DEPTH 10 - struct parse_context { struct jack_controller *controller_ptr; XML_Bool error; - unsigned int element[MAX_STACK_DEPTH]; - signed int depth; - jackctl_driver_t *driver; - jackctl_internal_t *internal; + bool option_value_capture; char option[JACK_PARAM_STRING_MAX+1]; int option_used; + const char * address[PARAM_ADDRESS_SIZE]; + int address_index; + char * container; char *name; }; @@ -80,7 +70,7 @@ jack_controller_settings_callback_chrdata(void *data, const XML_Char *s, int len return; } - if (context_ptr->element[context_ptr->depth] == PARSE_CONTEXT_OPTION) + if (context_ptr->option_value_capture) { if (context_ptr->option_used + len >= JACK_PARAM_STRING_MAX) { @@ -97,107 +87,69 @@ jack_controller_settings_callback_chrdata(void *data, const XML_Char *s, int len void jack_controller_settings_callback_elstart(void *data, const char *el, const char **attr) { - jackctl_driver_t *driver; - jackctl_internal_t *internal; - if (context_ptr->error) { return; } - if (context_ptr->depth + 1 >= MAX_STACK_DEPTH) + if (context_ptr->address_index >= PARAM_ADDRESS_SIZE) { - jack_error("xml parse max stack depth reached"); + assert(context_ptr->address_index == PARAM_ADDRESS_SIZE); + jack_error("xml param address max depth reached"); context_ptr->error = XML_TRUE; return; } + //jack_info("<%s>", el); + if (strcmp(el, "jack") == 0) { - //jack_info(""); - context_ptr->element[++context_ptr->depth] = PARSE_CONTEXT_JACK; return; } - if (strcmp(el, "engine") == 0) + if (strcmp(el, PTNODE_ENGINE) == 0) { - //jack_info(""); - context_ptr->element[++context_ptr->depth] = PARSE_CONTEXT_ENGINE; + context_ptr->address[context_ptr->address_index++] = PTNODE_ENGINE; return; } - if (strcmp(el, "drivers") == 0) + if (strcmp(el, PTNODE_DRIVERS) == 0) { - //jack_info(""); - context_ptr->element[++context_ptr->depth] = PARSE_CONTEXT_DRIVERS; + context_ptr->address[context_ptr->address_index++] = PTNODE_DRIVERS; return; } - if (strcmp(el, "internals") == 0) + if (strcmp(el, PTNODE_INTERNALS) == 0) { - //jack_info(""); - context_ptr->element[++context_ptr->depth] = PARSE_CONTEXT_INTERNALS; + context_ptr->address[context_ptr->address_index++] = PTNODE_INTERNALS; return; } - if (strcmp(el, "driver") == 0) + if (strcmp(el, "driver") == 0 || + strcmp(el, "internal") == 0) { if ((attr[0] == NULL || attr[2] != NULL) || strcmp(attr[0], "name") != 0) { - jack_error(" XML element must contain exactly one attribute, named \"name\""); + jack_error("<%s> XML element must contain exactly one attribute, named \"name\"", el); context_ptr->error = XML_TRUE; return; } - //jack_info(""); - context_ptr->element[++context_ptr->depth] = PARSE_CONTEXT_DRIVER; - - driver = jack_controller_find_driver(context_ptr->controller_ptr->server, attr[1]); - if (driver == NULL) - { - jack_error("ignoring settings for unknown driver \"%s\"", attr[1]); - } - else - { - jack_info("setting for driver \"%s\" found", attr[1]); - } - - context_ptr->driver = driver; - - return; - } - - if (strcmp(el, "internal") == 0) - { - if ((attr[0] == NULL || attr[2] != NULL) || strcmp(attr[0], "name") != 0) + context_ptr->container = strdup(attr[1]); + if (context_ptr->container == NULL) { - jack_error(" XML element must contain exactly one attribute, named \"name\""); + jack_error("strdup() failed"); context_ptr->error = XML_TRUE; return; } - //jack_info(""); - context_ptr->element[++context_ptr->depth] = PARSE_CONTEXT_INTERNAL; - - internal = jack_controller_find_internal(context_ptr->controller_ptr->server, attr[1]); - if (internal == NULL) - { - jack_error("ignoring settings for unknown internal \"%s\"", attr[1]); - } - else - { - jack_info("setting for internal \"%s\" found", attr[1]); - } - - context_ptr->internal = internal; + context_ptr->address[context_ptr->address_index++] = context_ptr->container; return; } - - + if (strcmp(el, "option") == 0) { - //jack_info("\n", dbus_call_context_ptr)) - { - return false; - } + return + jack_controller_settings_write_string(fd, ctx_ptr->indent, ctx_ptr->call) && + jack_controller_settings_write_string(fd, "\n", ctx_ptr->call); +} - return true; +bool serialize_modules(void * context, const char * name) +{ + ctx_ptr->indent = " "; + ctx_ptr->address[1] = name; + ctx_ptr->address[2] = NULL; + + return + jack_controller_settings_write_string(fd, " <", ctx_ptr->call) && + jack_controller_settings_write_string(fd, ctx_ptr->str, ctx_ptr->call) && + jack_controller_settings_write_string(fd, " name=\"", ctx_ptr->call) && + jack_controller_settings_write_string(fd, name, ctx_ptr->call) && + jack_controller_settings_write_string(fd, "\">\n", ctx_ptr->call) && + jack_params_iterate_params(ctx_ptr->params, ctx_ptr->address, jack_controller_serialize_parameter, ctx_ptr) && + jack_controller_settings_write_string(fd, " call) && + jack_controller_settings_write_string(fd, ctx_ptr->str, ctx_ptr->call) && + jack_controller_settings_write_string(fd, ">\n", ctx_ptr->call); } #undef fd +#undef ctx_ptr bool jack_controller_settings_save( @@ -114,9 +117,9 @@ jack_controller_settings_save( time_t timestamp; char timestamp_str[26]; struct save_context context; - const JSList * node_ptr; - jackctl_driver_t *driver; - jackctl_internal_t *internal; + const char * modules[] = {"driver", "internal", NULL}; + char buffer[100]; + unsigned int i; time(×tamp); ctime_r(×tamp, timestamp_str); @@ -147,6 +150,7 @@ jack_controller_settings_save( } context.fd = fd; + context.call = dbus_call_context_ptr; if (!jack_controller_settings_write_string(fd, "\n", dbus_call_context_ptr)) { @@ -196,7 +200,9 @@ jack_controller_settings_save( } context.indent = " "; - if (!jack_controller_settings_save_engine_options(&context, controller_ptr, dbus_call_context_ptr)) + context.address[0] = PTNODE_ENGINE; + context.address[1] = NULL; + if (!jack_params_iterate_params(controller_ptr->params, context.address, jack_controller_serialize_parameter, &context)) { goto exit_close; } @@ -206,100 +212,50 @@ jack_controller_settings_save( goto exit_close; } - /* drivers */ - - if (!jack_controller_settings_write_string(fd, " \n", dbus_call_context_ptr)) + for (i = 0; modules[i] != NULL; i++) { - goto exit_close; - } - - node_ptr = jackctl_server_get_drivers_list(controller_ptr->server); - - while (node_ptr != NULL) - { - driver = (jackctl_driver_t *)node_ptr->data; - - if (!jack_controller_settings_write_string(fd, " \n", dbus_call_context_ptr)) + if (!jack_controller_settings_write_string(fd, " <", dbus_call_context_ptr)) { goto exit_close; } - context.indent = " "; - - if (!jack_controller_settings_save_driver_options(&context, driver, dbus_call_context_ptr)) + if (!jack_controller_settings_write_string(fd, modules[i], dbus_call_context_ptr)) { goto exit_close; } - if (!jack_controller_settings_write_string(fd, " \n", dbus_call_context_ptr)) + if (!jack_controller_settings_write_string(fd, "s>\n", dbus_call_context_ptr)) { goto exit_close; } - node_ptr = jack_slist_next(node_ptr); - } + context.indent = " "; + context.params = controller_ptr->params; + context.str = modules[i]; + strcpy(buffer, modules[i]); + strcat(buffer, "s"); + context.address[0] = buffer; + context.address[1] = NULL; - if (!jack_controller_settings_write_string(fd, " \n", dbus_call_context_ptr)) - { - goto exit_close; - } - - /* internals */ - - if (!jack_controller_settings_write_string(fd, " \n", dbus_call_context_ptr)) - { - goto exit_close; - } - - node_ptr = jackctl_server_get_internals_list(controller_ptr->server); - - while (node_ptr != NULL) - { - internal = (jackctl_internal_t *)node_ptr->data; - - if (!jack_controller_settings_write_string(fd, " params, context.address, serialize_modules, &context)) { goto exit_close; } - if (!jack_controller_settings_write_string(fd, jackctl_internal_get_name(internal), dbus_call_context_ptr)) + if (!jack_controller_settings_write_string(fd, " \n", dbus_call_context_ptr)) + if (!jack_controller_settings_write_string(fd, modules[i], dbus_call_context_ptr)) { goto exit_close; } - context.indent = " "; - - if (!jack_controller_settings_save_internal_options(&context, internal, dbus_call_context_ptr)) + if (!jack_controller_settings_write_string(fd, "s>\n", dbus_call_context_ptr)) { goto exit_close; } - - if (!jack_controller_settings_write_string(fd, " \n", dbus_call_context_ptr)) - { - goto exit_close; - } - - node_ptr = jack_slist_next(node_ptr); - } - - if (!jack_controller_settings_write_string(fd, " \n", dbus_call_context_ptr)) - { - goto exit_close; } if (!jack_controller_settings_write_string(fd, "\n", dbus_call_context_ptr)) From 1d06e199437887dfeb97e718e4c3a502a3c8669c Mon Sep 17 00:00:00 2001 From: nedko Date: Sun, 17 Apr 2011 18:27:49 +0000 Subject: [PATCH 12/12] jackdbus: remove dead prototypes and functions git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@4316 0c269be4-1314-0410-8aa9-9f06e86f4224 --- dbus/controller.c | 20 ++------------------ dbus/controller_internal.h | 15 --------------- 2 files changed, 2 insertions(+), 33 deletions(-) diff --git a/dbus/controller.c b/dbus/controller.c index 15afe65a..002e3cf5 100644 --- a/dbus/controller.c +++ b/dbus/controller.c @@ -42,6 +42,7 @@ struct jack_dbus_interface_descriptor * g_jackcontroller_interfaces[] = NULL }; +static jackctl_driver_t * jack_controller_find_driver( jackctl_server_t *server, @@ -114,6 +115,7 @@ jack_controller_remove_slave_drivers( } } +static jackctl_internal_t * jack_controller_find_internal( jackctl_server_t *server, @@ -136,24 +138,6 @@ jack_controller_find_internal( return NULL; } -jackctl_parameter_t * -jack_controller_find_parameter( - const JSList * parameters_list, - const char * parameter_name) -{ - while (parameters_list) - { - if (strcmp(jackctl_parameter_get_name((jackctl_parameter_t *)parameters_list->data), parameter_name) == 0) - { - return parameters_list->data; - } - - parameters_list = jack_slist_next(parameters_list); - } - - return NULL; -} - bool jack_controller_select_driver( struct jack_controller * controller_ptr, diff --git a/dbus/controller_internal.h b/dbus/controller_internal.h index ae247c39..e01b2c09 100644 --- a/dbus/controller_internal.h +++ b/dbus/controller_internal.h @@ -59,21 +59,6 @@ struct jack_controller "You probably don't want to edit this because\n" \ "it will be overwritten next time jackdbus saves.\n" -jackctl_driver_t * -jack_controller_find_driver( - jackctl_server_t *server, - const char *driver_name); - -jackctl_internal_t * -jack_controller_find_internal( - jackctl_server_t *server, - const char *internal_name); - -jackctl_parameter_t * -jack_controller_find_parameter( - const JSList *parameters_list, - const char *parameter_name); - bool jack_controller_start_server( struct jack_controller *controller_ptr,