TraceLinJamConfig.h 84 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994
  1. #if DEBUG
  2. # include "Trace.h"
  3. # include "TraceLinJam.h"
  4. /* storage */
  5. #define DEBUG_TRACE_LOAD_CONFIG \
  6. Identifier root_node_id = CONFIG::PERSISTENCE_ID ; \
  7. if (default_config_xml == nullptr || !default_config_xml->hasTagName(root_node_id)) \
  8. Trace::TraceConfig("default config invalid - bailing") ; \
  9. else Trace::TraceConfig("default config loaded") ; \
  10. if (stored_config_xml == nullptr) \
  11. Trace::TraceConfig("stored config not found - falling back on defaults") ; \
  12. else if (!stored_config_xml->hasTagName(CONFIG::PERSISTENCE_ID)) \
  13. Trace::TraceConfig("stored config is invalid - falling back on defaults") ; \
  14. else Trace::TraceConfig("stored config found") ;
  15. #if TRACE_SANITIZE_CONFIG
  16. # define DEBUG_TRACE_SANITIZE_CONFIG \
  17. if (!is_stored_config_bogus) \
  18. Trace::TraceConfig("stored config parsed successfully =>" + \
  19. Trace::SanitizeConfig(ValueTree::fromXml(*default_config_xml) , \
  20. ValueTree::fromXml(*stored_config_xml) , \
  21. " " )) ;
  22. #else // TRACE_SANITIZE_CONFIG
  23. # define DEBUG_TRACE_SANITIZE_CONFIG ;
  24. #endif // TRACE_SANITIZE_CONFIG
  25. #if TRACE_CONFIG_TYPES
  26. # define DEBUG_TRACE_CONFIG_TYPES_VB \
  27. String parent_id = (node_id == CONFIG::PERSISTENCE_ID) ? "root " : \
  28. (grandparent_node == this->remoteUsers) ? \
  29. CONFIG::REMOTES_KEY + " " + String(parent_node.getType()) : \
  30. String(parent_node.getType()) ; \
  31. if (parent_node == this->servers || \
  32. parent_node == this->masterChannels || \
  33. parent_node == this->localChannels) \
  34. parent_id = String(parent_node.getType()) ; /* KLUDGE: (issue #33) */ \
  35. String dbg = "restoring types - " + parent_id + " " + String(node_id) + \
  36. " (" + String(config_store.getNumProperties()) + " properties - " + \
  37. String(config_store.getNumChildren()) + " children)" ; \
  38. for (int prop_n = 0 ; prop_n < config_store.getNumProperties() ; ++prop_n) \
  39. { \
  40. Identifier key = config_store.getPropertyName(prop_n) ; \
  41. dbg += "\n " + Trace::VarType(String(key) , config_store[key]) ; \
  42. } \
  43. Trace::TraceConfig(dbg) ;
  44. #else // TRACE_CONFIG_TYPES
  45. # define DEBUG_TRACE_CONFIG_TYPES_VB ;
  46. #endif // TRACE_CONFIG_TYPES
  47. #define DEBUG_TRACE_SANITY_CHECK \
  48. /* NOTE: these checks normally should be unnecessary */ \
  49. /* all tree nodes and properties will exist after sanitizeConfig() */ \
  50. /* and will be of the proper types after restoreVarTypeInfo() */ \
  51. /* only transient channels are not sanitized and so need be validated */ \
  52. \
  53. ValueTree client = this->client ; \
  54. ValueTree subs = this->subscriptions ; \
  55. ValueTree audio = this->audio ; \
  56. ValueTree server = this->server ; \
  57. ValueTree master = this->masterChannels.getChildWithName(CONFIG::MASTER_ID) ; \
  58. ValueTree metro = this->masterChannels.getChildWithName(CONFIG::METRO_ID) ; \
  59. \
  60. /* client properties */ \
  61. bool client_has_saveaudio_property = \
  62. client.hasProperty(CONFIG::SAVE_AUDIO_MODE_ID) ; \
  63. bool client_has_mixdown_property = \
  64. client.hasProperty(CONFIG::MIXDOWN_MODE_KEY) ; \
  65. bool client_has_savelog_property = \
  66. client.hasProperty(CONFIG::SHOULD_SAVE_LOG_ID) ; \
  67. bool client_has_debuglevel_property = \
  68. client.hasProperty(CONFIG::DEBUG_LEVEL_ID) ; \
  69. bool client_has_hide_bots_property = \
  70. client.hasProperty(CONFIG::SHOULD_HIDE_BOTS_ID) ; \
  71. \
  72. /* subscriptions properties */ \
  73. bool subs_has_autosubscribe_property = \
  74. subs.hasProperty(CONFIG::SUBSCRIBE_MODE_ID) ; \
  75. \
  76. /* audio properties */ \
  77. bool audio_has_winifn_property = \
  78. audio .hasProperty(CONFIG::WIN_AUDIO_IF_ID) ; \
  79. bool audio_has_asiodriver_property = \
  80. audio .hasProperty(CONFIG::ASIO_DRIVER_ID) ; \
  81. bool audio_has_asioinput0_property = \
  82. audio .hasProperty(CONFIG::ASIO_INPUT0_ID) ; \
  83. bool audio_has_asioinput1_property = \
  84. audio .hasProperty(CONFIG::ASIO_INPUT1_ID) ; \
  85. bool audio_has_asiooutput0_property = \
  86. audio .hasProperty(CONFIG::ASIO_OUTPUT0_ID) ; \
  87. bool audio_has_asiooutput1_property = \
  88. audio .hasProperty(CONFIG::ASIO_OUTPUT1_ID) ; \
  89. bool audio_has_ksinput_property = \
  90. audio .hasProperty(CONFIG::KS_INPUT_ID) ; \
  91. bool audio_has_ksoutput_property = \
  92. audio .hasProperty(CONFIG::KS_OUTPUT_ID) ; \
  93. bool audio_has_ksbitdepth_property = \
  94. audio .hasProperty(CONFIG::KS_BITDEPTH_ID) ; \
  95. bool audio_has_kssamplerate_property = \
  96. audio .hasProperty(CONFIG::KS_SAMPLERATE_ID) ; \
  97. bool audio_has_ksnblocks_property = \
  98. audio .hasProperty(CONFIG::KS_NBLOCKS_ID) ; \
  99. bool audio_has_ksblocksize_property = \
  100. audio .hasProperty(CONFIG::KS_BLOCKSIZE_ID) ; \
  101. bool audio_has_dsinput0_property = \
  102. audio .hasProperty(CONFIG::DS_INPUT0_ID) ; \
  103. bool audio_has_dsinput1_property = \
  104. audio .hasProperty(CONFIG::DS_INPUT1_ID) ; \
  105. bool audio_has_dsinput2_property = \
  106. audio .hasProperty(CONFIG::DS_INPUT2_ID) ; \
  107. bool audio_has_dsinput3_property = \
  108. audio .hasProperty(CONFIG::DS_INPUT3_ID) ; \
  109. bool audio_has_dsoutput0_property = \
  110. audio .hasProperty(CONFIG::DS_OUTPUT0_ID) ; \
  111. bool audio_has_dsoutput1_property = \
  112. audio .hasProperty(CONFIG::DS_OUTPUT1_ID) ; \
  113. bool audio_has_dsoutput2_property = \
  114. audio .hasProperty(CONFIG::DS_OUTPUT2_ID) ; \
  115. bool audio_has_dsoutput3_property = \
  116. audio .hasProperty(CONFIG::DS_OUTPUT3_ID) ; \
  117. bool audio_has_dsbitdepth_property = \
  118. audio .hasProperty(CONFIG::DS_BITDEPTH_ID) ; \
  119. bool audio_has_dssamplerate_property = \
  120. audio .hasProperty(CONFIG::DS_SAMPLERATE_ID) ; \
  121. bool audio_has_dsnblocks_property = \
  122. audio .hasProperty(CONFIG::DS_NBLOCKS_ID) ; \
  123. bool audio_has_dsblocksize_property = \
  124. audio .hasProperty(CONFIG::DS_BLOCKSIZE_ID) ; \
  125. bool audio_has_waveinput_property = \
  126. audio .hasProperty(CONFIG::WAVE_INPUT_ID) ; \
  127. bool audio_has_waveoutput_property = \
  128. audio .hasProperty(CONFIG::WAVE_OUTPUT_ID) ; \
  129. bool audio_has_wavebitdepth_property = \
  130. audio .hasProperty(CONFIG::WAVE_BITDEPTH_ID) ; \
  131. bool audio_has_wavesamplerate_property = \
  132. audio .hasProperty(CONFIG::WAVE_SAMPLERATE_ID) ; \
  133. bool audio_has_wavenblocks_property = \
  134. audio .hasProperty(CONFIG::WAVE_NBLOCKS_ID) ; \
  135. bool audio_has_waveblocksize_property = \
  136. audio .hasProperty(CONFIG::WAVE_BLOCKSIZE_ID) ; \
  137. bool audio_has_macdevice_property = \
  138. audio .hasProperty(CONFIG::MAC_DEVICE_ID) ; \
  139. bool audio_has_macninputs_property = \
  140. audio .hasProperty(CONFIG::MAC_NINPUTS_ID) ; \
  141. bool audio_has_macbitdepth_property = \
  142. audio .hasProperty(CONFIG::MAC_BITDEPTH_ID) ; \
  143. bool audio_has_macsamplerate_property = \
  144. audio .hasProperty(CONFIG::MAC_SAMPLERATE_ID) ; \
  145. bool audio_has_nixifn_property = \
  146. audio .hasProperty(CONFIG::NIX_AUDIO_IF_ID) ; \
  147. bool audio_has_jackserver_property = \
  148. audio .hasProperty(CONFIG::JACK_SERVER_ID) ; \
  149. bool audio_has_jackname_property = \
  150. audio .hasProperty(CONFIG::JACK_NAME_ID) ; \
  151. bool audio_has_jackninputs_property = \
  152. audio .hasProperty(CONFIG::JACK_NINPUTS_ID) ; \
  153. bool audio_has_jacknoutputs_property = \
  154. audio .hasProperty(CONFIG::JACK_NOUTPUTS_ID) ; \
  155. bool audio_has_alsaconfig_property = \
  156. audio .hasProperty(CONFIG::ALSA_CONFIG_ID) ; \
  157. \
  158. /* server properties */ \
  159. bool server_has_host_property = \
  160. server.hasProperty(CONFIG::HOST_ID) ; \
  161. bool server_has_login_property = \
  162. server.hasProperty(CONFIG::LOGIN_ID) ; \
  163. bool server_has_pass_property = \
  164. server.hasProperty(CONFIG::PASS_ID) ; \
  165. bool server_has_is_anonymous_property = \
  166. server.hasProperty(CONFIG::IS_ANONYMOUS_ID) ; \
  167. bool server_has_is_agreed_property = \
  168. server.hasProperty(CONFIG::IS_AGREED_ID) ; \
  169. bool server_has_should_agree_property = \
  170. server.hasProperty(CONFIG::SHOULD_AGREE_ID) ; \
  171. \
  172. /* masters properties */ \
  173. bool master_channel_has_name_property = \
  174. master.hasProperty(CONFIG::CHANNEL_NAME_ID) ; \
  175. bool master_channel_has_volume_property = \
  176. master.hasProperty(CONFIG::VOLUME_ID) ; \
  177. bool master_channel_has_pan_property = \
  178. master.hasProperty(CONFIG::PAN_ID) ; \
  179. bool master_channel_has_mute_property = \
  180. master.hasProperty(CONFIG::IS_MUTED_ID) ; \
  181. bool master_channel_has_stereo_property = \
  182. master.hasProperty(CONFIG::STEREO_ID) ; \
  183. bool master_channel_has_vuleft_property = \
  184. master.hasProperty(CONFIG::VU_LEFT_ID) ; \
  185. bool master_channel_has_vuright_property = \
  186. master.hasProperty(CONFIG::VU_RIGHT_ID) ; \
  187. bool metro_channel_has_name_property = \
  188. metro .hasProperty(CONFIG::CHANNEL_NAME_ID) ; \
  189. bool metro_channel_has_volume_property = \
  190. metro .hasProperty(CONFIG::VOLUME_ID) ; \
  191. bool metro_channel_has_pan_property = \
  192. metro .hasProperty(CONFIG::PAN_ID) ; \
  193. bool metro_channel_has_mute_property = \
  194. metro .hasProperty(CONFIG::IS_MUTED_ID) ; \
  195. bool metro_channel_has_source_property = \
  196. metro .hasProperty(CONFIG::SOURCE_N_ID) ; \
  197. bool metro_channel_has_stereo_property = \
  198. metro .hasProperty(CONFIG::STEREO_ID) ; \
  199. bool metro_channel_has_vuleft_property = \
  200. metro .hasProperty(CONFIG::VU_LEFT_ID) ; \
  201. bool metro_channel_has_vuright_property = \
  202. metro .hasProperty(CONFIG::VU_RIGHT_ID) ; \
  203. \
  204. /* client datatypes */ \
  205. bool save_audio_is_int = client[CONFIG::SAVE_AUDIO_MODE_ID] .isInt() ; \
  206. bool mixdown_is_int = client[CONFIG::MIXDOWN_MODE_KEY] .isInt() ; \
  207. bool save_log_is_bool = client[CONFIG::SHOULD_SAVE_LOG_ID] .isBool() ; \
  208. bool debug_level_is_int = client[CONFIG::DEBUG_LEVEL_ID] .isInt() ; \
  209. bool should_hide_bots_is_bool = client[CONFIG::SHOULD_HIDE_BOTS_ID].isBool() ; \
  210. \
  211. /* subscriptions datatypes */ \
  212. bool autosubscribe_is_int = subs [CONFIG::SUBSCRIBE_MODE_ID] .isInt() ; \
  213. \
  214. /* audio datatypes */ \
  215. bool win_audio_ifn_is_int = audio [CONFIG::WIN_AUDIO_IF_ID] .isInt() ; \
  216. bool asio_driver_is_int = audio [CONFIG::ASIO_DRIVER_ID] .isInt() ; \
  217. bool asio_input0_is_int = audio [CONFIG::ASIO_INPUT0_ID] .isInt() ; \
  218. bool asio_inout1_is_int = audio [CONFIG::ASIO_INPUT1_ID] .isInt() ; \
  219. bool asio_output0_is_int = audio [CONFIG::ASIO_OUTPUT0_ID] .isInt() ; \
  220. bool asio_output1_is_int = audio [CONFIG::ASIO_OUTPUT1_ID] .isInt() ; \
  221. bool ks_input_is_int = audio [CONFIG::KS_INPUT_ID] .isInt() ; \
  222. bool ks_output_is_int = audio [CONFIG::KS_OUTPUT_ID] .isInt() ; \
  223. bool ks_bitdepth_is_int = audio [CONFIG::KS_BITDEPTH_ID] .isInt() ; \
  224. bool ks_samplerate_is_int = audio [CONFIG::KS_SAMPLERATE_ID] .isInt() ; \
  225. bool ks_n_blocks_is_int = audio [CONFIG::KS_NBLOCKS_ID] .isInt() ; \
  226. bool ks_blocksize_is_int = audio [CONFIG::KS_BLOCKSIZE_ID] .isInt() ; \
  227. bool ds_input0_is_int = audio [CONFIG::DS_INPUT0_ID] .isInt() ; \
  228. bool ds_input1_is_int = audio [CONFIG::DS_INPUT1_ID] .isInt() ; \
  229. bool ds_input2_is_int = audio [CONFIG::DS_INPUT2_ID] .isInt() ; \
  230. bool ds_input3_is_int = audio [CONFIG::DS_INPUT3_ID] .isInt() ; \
  231. bool ds_output0_is_int = audio [CONFIG::DS_OUTPUT0_ID] .isInt() ; \
  232. bool ds_output1_is_int = audio [CONFIG::DS_OUTPUT1_ID] .isInt() ; \
  233. bool ds_output2_is_int = audio [CONFIG::DS_OUTPUT2_ID] .isInt() ; \
  234. bool ds_output3_is_int = audio [CONFIG::DS_OUTPUT3_ID] .isInt() ; \
  235. bool ds_bitdepth_is_int = audio [CONFIG::DS_BITDEPTH_ID] .isInt() ; \
  236. bool ds_samplerate_is_int = audio [CONFIG::DS_SAMPLERATE_ID] .isInt() ; \
  237. bool ds_n_blocks_is_int = audio [CONFIG::DS_NBLOCKS_ID] .isInt() ; \
  238. bool ds_blocksize_is_int = audio [CONFIG::DS_BLOCKSIZE_ID] .isInt() ; \
  239. bool wave_input_is_int = audio [CONFIG::WAVE_INPUT_ID] .isInt() ; \
  240. bool wave_output_is_int = audio [CONFIG::WAVE_OUTPUT_ID] .isInt() ; \
  241. bool wave_bitdepth_is_int = audio [CONFIG::WAVE_BITDEPTH_ID] .isInt() ; \
  242. bool wave_samplerate_is_int = audio [CONFIG::WAVE_SAMPLERATE_ID] .isInt() ; \
  243. bool wave_n_blocks_is_int = audio [CONFIG::WAVE_NBLOCKS_ID] .isInt() ; \
  244. bool wave_blocksize_is_int = audio [CONFIG::WAVE_BLOCKSIZE_ID] .isInt() ; \
  245. bool mac_device_is_string = audio [CONFIG::MAC_DEVICE_ID] .isString() ; \
  246. bool mac_n_inputs_is_int = audio [CONFIG::MAC_NINPUTS_ID] .isInt() ; \
  247. bool mac_bitdepth_is_int = audio [CONFIG::MAC_BITDEPTH_ID] .isInt() ; \
  248. bool mac_samplerate_is_int = audio [CONFIG::MAC_SAMPLERATE_ID] .isInt() ; \
  249. bool nix_audio_ifn_is_int = audio [CONFIG::NIX_AUDIO_IF_ID] .isInt() ; \
  250. bool jack_server_is_int = audio [CONFIG::JACK_SERVER_ID] .isInt() ; \
  251. bool jack_name_is_string = audio [CONFIG::JACK_NAME_ID] .isString() ; \
  252. bool jack_n_inputs_is_int = audio [CONFIG::JACK_NINPUTS_ID] .isInt() ; \
  253. bool jack_n_outputs_is_int = audio [CONFIG::JACK_NOUTPUTS_ID] .isInt() ; \
  254. bool alsa_config_is_string = audio [CONFIG::ALSA_CONFIG_ID] .isString() ; \
  255. \
  256. /* server datatypes */ \
  257. bool host_name_is_string = server[CONFIG::HOST_ID] .isString() ; \
  258. bool login_is_string = server[CONFIG::LOGIN_ID] .isString() ; \
  259. bool pass_is_string = server[CONFIG::PASS_ID] .isString() ; \
  260. bool is_anon_is_bool = server[CONFIG::IS_ANONYMOUS_ID] .isBool() ; \
  261. bool is_agreed_is_bool = server[CONFIG::IS_AGREED_ID] .isBool() ; \
  262. bool should_agree_is_bool = server[CONFIG::SHOULD_AGREE_ID] .isBool() ; \
  263. \
  264. /* masters datatypes */ \
  265. bool master_name_is_string = master[CONFIG::CHANNEL_NAME_ID] .isString() ; \
  266. bool master_volume_is_double = master[CONFIG::VOLUME_ID] .isDouble() ; \
  267. bool master_pan_is_double = master[CONFIG::PAN_ID] .isDouble() ; \
  268. bool master_mute_is_bool = master[CONFIG::IS_MUTED_ID] .isBool() ; \
  269. bool master_stereo_is_int = master[CONFIG::STEREO_ID] .isInt() ; \
  270. bool master_vuleft_is_double = master[CONFIG::VU_LEFT_ID] .isDouble() ; \
  271. bool master_vuright_is_double = master[CONFIG::VU_RIGHT_ID] .isDouble() ; \
  272. bool metro_name_is_string = metro [CONFIG::CHANNEL_NAME_ID] .isString() ; \
  273. bool metro_volume_is_double = metro [CONFIG::VOLUME_ID] .isDouble() ; \
  274. bool metro_pan_is_double = metro [CONFIG::PAN_ID] .isDouble() ; \
  275. bool metro_mute_is_bool = metro [CONFIG::IS_MUTED_ID] .isBool() ; \
  276. bool metro_source_is_int = metro [CONFIG::SOURCE_N_ID] .isInt() ; \
  277. bool metro_stereo_is_int = metro [CONFIG::STEREO_ID] .isInt() ; \
  278. bool metro_vuleft_is_double = metro [CONFIG::VU_LEFT_ID] .isDouble() ; \
  279. bool metro_vuright_is_double = metro [CONFIG::VU_RIGHT_ID] .isDouble() ; \
  280. \
  281. /* subscribed nodes */ \
  282. if (!root_is_valid) \
  283. Trace::TraceInvalidNode(CONFIG::PERSISTENCE_KEY) ; \
  284. if (!client_is_valid) \
  285. Trace::TraceInvalidNode(CONFIG::CLIENT_KEY) ; \
  286. if (!subscriptions_is_valid) \
  287. Trace::TraceInvalidNode(CONFIG::SUBSCRIPTIONS_KEY) ; \
  288. if (!audio_is_valid) \
  289. Trace::TraceInvalidNode(CONFIG::AUDIO_KEY) ; \
  290. if (!server_is_valid) \
  291. Trace::TraceInvalidNode(CONFIG::SERVER_KEY) ; \
  292. if (!servers_is_valid) \
  293. Trace::TraceInvalidNode(CONFIG::SERVERS_KEY) ; \
  294. if (!master_channels_is_valid) \
  295. Trace::TraceInvalidNode(CONFIG::MASTERS_KEY) ; \
  296. if (!local_channels_is_valid) \
  297. Trace::TraceInvalidNode(CONFIG::LOCALS_KEY) ; \
  298. if (!remote_users_is_valid) \
  299. Trace::TraceInvalidNode(CONFIG::REMOTES_KEY) ; \
  300. \
  301. /* client properties */ \
  302. if (!client_has_saveaudio_property) \
  303. Trace::TraceMissingProperty(CONFIG::CLIENT_KEY , CONFIG::SAVE_AUDIO_MODE_KEY) ; \
  304. if (!client_has_mixdown_property) \
  305. Trace::TraceMissingProperty(CONFIG::CLIENT_KEY , CONFIG::MIXDOWN_MODE_KEY) ; \
  306. if (!client_has_savelog_property) \
  307. Trace::TraceMissingProperty(CONFIG::CLIENT_KEY , CONFIG::SHOULD_SAVE_LOG_KEY) ; \
  308. if (!client_has_debuglevel_property) \
  309. Trace::TraceMissingProperty(CONFIG::CLIENT_KEY , CONFIG::DEBUG_LEVEL_KEY) ; \
  310. if (!client_has_hide_bots_property) \
  311. Trace::TraceMissingProperty(CONFIG::CLIENT_KEY , CONFIG::SHOULD_HIDE_BOTS_KEY) ; \
  312. \
  313. /* subscriptions properties */ \
  314. if (!subs_has_autosubscribe_property) \
  315. Trace::TraceMissingProperty(CONFIG::SUBSCRIPTIONS_KEY , CONFIG::SUBSCRIBE_MODE_KEY) ;\
  316. \
  317. /* audio properties */ \
  318. if (!audio_has_winifn_property) \
  319. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::WIN_AUDIO_IF_KEY) ; \
  320. if (!audio_has_asiodriver_property) \
  321. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::ASIO_DRIVER_KEY) ; \
  322. if (!audio_has_asioinput0_property) \
  323. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::ASIO_INPUT0_KEY) ; \
  324. if (!audio_has_asioinput1_property) \
  325. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::ASIO_INPUT1_KEY) ; \
  326. if (!audio_has_asiooutput0_property) \
  327. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::ASIO_OUTPUT0_KEY) ; \
  328. if (!audio_has_asiooutput1_property) \
  329. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::ASIO_OUTPUT1_KEY) ; \
  330. if (!audio_has_ksinput_property) \
  331. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::KS_INPUT_KEY) ; \
  332. if (!audio_has_ksoutput_property) \
  333. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::KS_OUTPUT_KEY) ; \
  334. if (!audio_has_ksbitdepth_property) \
  335. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::KS_BITDEPTH_KEY) ; \
  336. if (!audio_has_kssamplerate_property) \
  337. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::KS_SAMPLERATE_KEY) ; \
  338. if (!audio_has_ksnblocks_property) \
  339. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::KS_NBLOCKS_KEY) ; \
  340. if (!audio_has_ksblocksize_property) \
  341. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::KS_BLOCKSIZE_KEY) ; \
  342. if (!audio_has_dsinput0_property) \
  343. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::DS_INPUT0_KEY) ; \
  344. if (!audio_has_dsinput1_property) \
  345. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::DS_INPUT1_KEY) ; \
  346. if (!audio_has_dsinput2_property) \
  347. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::DS_INPUT2_KEY) ; \
  348. if (!audio_has_dsinput3_property) \
  349. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::DS_INPUT3_KEY) ; \
  350. if (!audio_has_dsoutput0_property) \
  351. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::DS_OUTPUT0_KEY) ; \
  352. if (!audio_has_dsoutput1_property) \
  353. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::DS_OUTPUT1_KEY) ; \
  354. if (!audio_has_dsoutput2_property) \
  355. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::DS_OUTPUT2_KEY) ; \
  356. if (!audio_has_dsoutput3_property) \
  357. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::DS_OUTPUT3_KEY) ; \
  358. if (!audio_has_dsbitdepth_property) \
  359. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::DS_BITDEPTH_KEY) ; \
  360. if (!audio_has_dssamplerate_property) \
  361. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::DS_SAMPLERATE_KEY) ; \
  362. if (!audio_has_dsnblocks_property) \
  363. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::DS_NBLOCKS_KEY) ; \
  364. if (!audio_has_dsblocksize_property) \
  365. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::DS_BLOCKSIZE_KEY) ; \
  366. if (!audio_has_waveinput_property) \
  367. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::WAVE_INPUT_KEY) ; \
  368. if (!audio_has_waveoutput_property) \
  369. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::WAVE_OUTPUT_KEY) ; \
  370. if (!audio_has_wavebitdepth_property) \
  371. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::WAVE_BITDEPTH_KEY) ; \
  372. if (!audio_has_wavesamplerate_property) \
  373. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::WAVE_SAMPLERATE_KEY) ; \
  374. if (!audio_has_wavenblocks_property) \
  375. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::WAVE_NBLOCKS_KEY) ; \
  376. if (!audio_has_waveblocksize_property) \
  377. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::WAVE_BLOCKSIZE_KEY) ; \
  378. if (!audio_has_macdevice_property) \
  379. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::MAC_DEVICE_KEY) ; \
  380. if (!audio_has_macninputs_property) \
  381. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::MAC_NINPUTS_KEY) ; \
  382. if (!audio_has_macbitdepth_property) \
  383. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::MAC_BITDEPTH_KEY) ; \
  384. if (!audio_has_macsamplerate_property) \
  385. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::MAC_SAMPLERATE_KEY) ; \
  386. if (!audio_has_nixifn_property) \
  387. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::NIX_AUDIO_IF_KEY) ; \
  388. if (!audio_has_jackserver_property) \
  389. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::JACK_SERVER_KEY) ; \
  390. if (!audio_has_jackname_property) \
  391. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::JACK_NAME_KEY) ; \
  392. if (!audio_has_jackninputs_property) \
  393. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::JACK_NINPUTS_KEY) ; \
  394. if (!audio_has_jacknoutputs_property) \
  395. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::JACK_NOUTPUTS_KEY) ; \
  396. if (!audio_has_alsaconfig_property) \
  397. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::ALSA_CONFIG_KEY) ; \
  398. \
  399. /* server properties */ \
  400. if (!server_has_host_property) \
  401. Trace::TraceMissingValue(CONFIG::SERVER_KEY , CONFIG::HOST_KEY) ; \
  402. if (!server_has_login_property) \
  403. Trace::TraceMissingValue(CONFIG::SERVER_KEY , CONFIG::LOGIN_KEY) ; \
  404. if (!server_has_pass_property) \
  405. Trace::TraceMissingValue(CONFIG::SERVER_KEY , CONFIG::PASS_KEY) ; \
  406. if (!server_has_is_anonymous_property) \
  407. Trace::TraceMissingValue(CONFIG::SERVER_KEY , CONFIG::IS_ANONYMOUS_KEY) ; \
  408. if (!server_has_is_agreed_property) \
  409. Trace::TraceMissingValue(CONFIG::SERVER_KEY , CONFIG::IS_AGREED_KEY) ; \
  410. if (!server_has_should_agree_property) \
  411. Trace::TraceMissingValue(CONFIG::SERVER_KEY , CONFIG::SHOULD_AGREE_KEY) ; \
  412. \
  413. /* masters properties */ \
  414. if (!master_channel_has_name_property) \
  415. Trace::TraceMissingProperty(CONFIG::MASTER_KEY , CONFIG::CHANNEL_NAME_KEY) ; \
  416. if (!master_channel_has_volume_property) \
  417. Trace::TraceMissingProperty(CONFIG::MASTER_KEY , CONFIG::VOLUME_KEY) ; \
  418. if (!master_channel_has_pan_property) \
  419. Trace::TraceMissingProperty(CONFIG::MASTER_KEY , CONFIG::PAN_KEY) ; \
  420. if (!master_channel_has_mute_property) \
  421. Trace::TraceMissingProperty(CONFIG::MASTER_KEY , CONFIG::IS_MUTED_KEY) ; \
  422. if (!master_channel_has_stereo_property) \
  423. Trace::TraceMissingProperty(CONFIG::MASTER_KEY , CONFIG::STEREO_KEY) ; \
  424. if (!master_channel_has_vuleft_property) \
  425. Trace::TraceMissingProperty(CONFIG::MASTER_KEY , CONFIG::VU_LEFT_KEY) ; \
  426. if (!master_channel_has_vuright_property) \
  427. Trace::TraceMissingProperty(CONFIG::MASTER_KEY , CONFIG::VU_RIGHT_KEY) ; \
  428. if (!metro_channel_has_name_property) \
  429. Trace::TraceMissingProperty(CONFIG::METRO_KEY , CONFIG::CHANNEL_NAME_KEY) ; \
  430. if (!metro_channel_has_volume_property) \
  431. Trace::TraceMissingProperty(CONFIG::METRO_KEY , CONFIG::VOLUME_KEY) ; \
  432. if (!metro_channel_has_pan_property) \
  433. Trace::TraceMissingProperty(CONFIG::METRO_KEY , CONFIG::PAN_KEY) ; \
  434. if (!metro_channel_has_mute_property) \
  435. Trace::TraceMissingProperty(CONFIG::METRO_KEY , CONFIG::IS_MUTED_KEY) ; \
  436. if (!metro_channel_has_source_property) \
  437. Trace::TraceMissingProperty(CONFIG::METRO_KEY , CONFIG::SOURCE_N_KEY) ; \
  438. if (!metro_channel_has_stereo_property) \
  439. Trace::TraceMissingProperty(CONFIG::METRO_KEY , CONFIG::STEREO_KEY) ; \
  440. if (!metro_channel_has_vuleft_property) \
  441. Trace::TraceMissingProperty(CONFIG::METRO_KEY , CONFIG::VU_LEFT_KEY) ; \
  442. if (!metro_channel_has_vuright_property) \
  443. Trace::TraceMissingProperty(CONFIG::METRO_KEY , CONFIG::VU_RIGHT_KEY) ; \
  444. \
  445. /* client datatypes */ \
  446. if (!save_audio_is_int) \
  447. Trace::TraceTypeMismatch(client , CONFIG::SAVE_AUDIO_MODE_KEY , \
  448. CONFIG::INT_TYPE , client[CONFIG::SAVE_AUDIO_MODE_ID]) ; \
  449. if (!mixdown_is_int) \
  450. Trace::TraceTypeMismatch(client , CONFIG::MIXDOWN_MODE_KEY , \
  451. CONFIG::INT_TYPE , client[CONFIG::MIXDOWN_MODE_KEY]) ; \
  452. if (!save_log_is_bool) \
  453. Trace::TraceTypeMismatch(client , CONFIG::SHOULD_SAVE_LOG_KEY , \
  454. CONFIG::BOOL_TYPE , client[CONFIG::SHOULD_SAVE_LOG_ID]) ; \
  455. if (!debug_level_is_int) \
  456. Trace::TraceTypeMismatch(client , CONFIG::DEBUG_LEVEL_KEY , \
  457. CONFIG::INT_TYPE , client[CONFIG::DEBUG_LEVEL_ID]) ; \
  458. if (!should_hide_bots_is_bool) \
  459. Trace::TraceTypeMismatch(client , CONFIG::SHOULD_HIDE_BOTS_KEY , \
  460. CONFIG::BOOL_TYPE , client[CONFIG::SHOULD_HIDE_BOTS_ID]) ;\
  461. \
  462. /* subscriptions datatypes */ \
  463. if (!autosubscribe_is_int) \
  464. Trace::TraceTypeMismatch(subs , CONFIG::SUBSCRIBE_MODE_KEY , \
  465. CONFIG::INT_TYPE , client[CONFIG::SUBSCRIBE_MODE_ID]) ; \
  466. \
  467. /* audio datatypes */ \
  468. if (!win_audio_ifn_is_int) \
  469. Trace::TraceTypeMismatch(audio , CONFIG::WIN_AUDIO_IF_KEY , \
  470. CONFIG::INT_TYPE , audio[CONFIG::WIN_AUDIO_IF_ID]) ; \
  471. if (!asio_driver_is_int) \
  472. Trace::TraceTypeMismatch(audio , CONFIG::ASIO_DRIVER_KEY , \
  473. CONFIG::INT_TYPE , audio[CONFIG::ASIO_DRIVER_ID]) ; \
  474. if (!asio_input0_is_int) \
  475. Trace::TraceTypeMismatch(audio , CONFIG::ASIO_INPUT0_KEY , \
  476. CONFIG::INT_TYPE , audio[CONFIG::ASIO_INPUT0_ID]) ; \
  477. if (!asio_inout1_is_int) \
  478. Trace::TraceTypeMismatch(audio , CONFIG::ASIO_INPUT1_KEY , \
  479. CONFIG::INT_TYPE , audio[CONFIG::ASIO_INPUT1_ID]) ; \
  480. if (!asio_output0_is_int) \
  481. Trace::TraceTypeMismatch(audio , CONFIG::ASIO_OUTPUT0_KEY , \
  482. CONFIG::INT_TYPE , audio[CONFIG::ASIO_OUTPUT0_ID]) ; \
  483. if (!asio_output1_is_int) \
  484. Trace::TraceTypeMismatch(audio , CONFIG::ASIO_OUTPUT1_KEY , \
  485. CONFIG::INT_TYPE , audio[CONFIG::ASIO_OUTPUT1_ID]) ; \
  486. if (!ks_input_is_int) \
  487. Trace::TraceTypeMismatch(audio , CONFIG::KS_INPUT_KEY , \
  488. CONFIG::INT_TYPE , audio[CONFIG::KS_INPUT_ID]) ; \
  489. if (!ks_output_is_int) \
  490. Trace::TraceTypeMismatch(audio , CONFIG::KS_OUTPUT_KEY , \
  491. CONFIG::INT_TYPE , audio[CONFIG::KS_OUTPUT_ID]) ; \
  492. if (!ks_bitdepth_is_int) \
  493. Trace::TraceTypeMismatch(audio , CONFIG::KS_BITDEPTH_KEY , \
  494. CONFIG::INT_TYPE , audio[CONFIG::KS_BITDEPTH_ID]) ; \
  495. if (!ks_samplerate_is_int) \
  496. Trace::TraceTypeMismatch(audio , CONFIG::KS_SAMPLERATE_KEY , \
  497. CONFIG::INT_TYPE , audio[CONFIG::KS_SAMPLERATE_ID]) ; \
  498. if (!ks_n_blocks_is_int) \
  499. Trace::TraceTypeMismatch(audio , CONFIG::KS_NBLOCKS_KEY , \
  500. CONFIG::INT_TYPE , audio[CONFIG::KS_NBLOCKS_ID]) ; \
  501. if (!ks_blocksize_is_int) \
  502. Trace::TraceTypeMismatch(audio , CONFIG::KS_BLOCKSIZE_KEY , \
  503. CONFIG::INT_TYPE , audio[CONFIG::KS_BLOCKSIZE_ID]) ; \
  504. if (!ds_input0_is_int) \
  505. Trace::TraceTypeMismatch(audio , CONFIG::DS_INPUT0_KEY , \
  506. CONFIG::INT_TYPE , audio[CONFIG::DS_INPUT0_ID]) ; \
  507. if (!ds_input1_is_int) \
  508. Trace::TraceTypeMismatch(audio , CONFIG::DS_INPUT1_KEY , \
  509. CONFIG::INT_TYPE , audio[CONFIG::DS_INPUT1_ID]) ; \
  510. if (!ds_input2_is_int) \
  511. Trace::TraceTypeMismatch(audio , CONFIG::DS_INPUT2_KEY , \
  512. CONFIG::INT_TYPE , audio[CONFIG::DS_INPUT2_ID]) ; \
  513. if (!ds_input3_is_int) \
  514. Trace::TraceTypeMismatch(audio , CONFIG::DS_INPUT3_KEY , \
  515. CONFIG::INT_TYPE , audio[CONFIG::DS_INPUT3_ID]) ; \
  516. if (!ds_output0_is_int) \
  517. Trace::TraceTypeMismatch(audio , CONFIG::DS_OUTPUT0_KEY , \
  518. CONFIG::INT_TYPE , audio[CONFIG::DS_OUTPUT0_ID]) ; \
  519. if (!ds_output1_is_int) \
  520. Trace::TraceTypeMismatch(audio , CONFIG::DS_OUTPUT1_KEY , \
  521. CONFIG::INT_TYPE , audio[CONFIG::DS_OUTPUT1_ID]) ; \
  522. if (!ds_output2_is_int) \
  523. Trace::TraceTypeMismatch(audio , CONFIG::DS_OUTPUT2_KEY , \
  524. CONFIG::INT_TYPE , audio[CONFIG::DS_OUTPUT2_ID]) ; \
  525. if (!ds_output3_is_int) \
  526. Trace::TraceTypeMismatch(audio , CONFIG::DS_OUTPUT3_KEY , \
  527. CONFIG::INT_TYPE , audio[CONFIG::DS_OUTPUT3_ID]) ; \
  528. if (!ds_bitdepth_is_int) \
  529. Trace::TraceTypeMismatch(audio , CONFIG::DS_BITDEPTH_KEY , \
  530. CONFIG::INT_TYPE , audio[CONFIG::DS_BITDEPTH_ID]) ; \
  531. if (!ds_samplerate_is_int) \
  532. Trace::TraceTypeMismatch(audio , CONFIG::DS_SAMPLERATE_KEY , \
  533. CONFIG::INT_TYPE , audio[CONFIG::DS_SAMPLERATE_ID]) ; \
  534. if (!ds_n_blocks_is_int) \
  535. Trace::TraceTypeMismatch(audio , CONFIG::DS_NBLOCKS_KEY , \
  536. CONFIG::INT_TYPE , audio[CONFIG::DS_NBLOCKS_ID]) ; \
  537. if (!ds_blocksize_is_int) \
  538. Trace::TraceTypeMismatch(audio , CONFIG::DS_BLOCKSIZE_KEY , \
  539. CONFIG::INT_TYPE , audio[CONFIG::DS_BLOCKSIZE_ID]) ; \
  540. if (!wave_input_is_int) \
  541. Trace::TraceTypeMismatch(audio , CONFIG::WAVE_INPUT_KEY , \
  542. CONFIG::INT_TYPE , audio[CONFIG::WAVE_INPUT_ID]) ; \
  543. if (!wave_output_is_int) \
  544. Trace::TraceTypeMismatch(audio , CONFIG::WAVE_OUTPUT_KEY , \
  545. CONFIG::INT_TYPE , audio[CONFIG::WAVE_OUTPUT_ID]) ; \
  546. if (!wave_bitdepth_is_int) \
  547. Trace::TraceTypeMismatch(audio , CONFIG::WAVE_BITDEPTH_KEY , \
  548. CONFIG::INT_TYPE , audio[CONFIG::WAVE_BITDEPTH_ID]) ; \
  549. if (!wave_samplerate_is_int) \
  550. Trace::TraceTypeMismatch(audio , CONFIG::WAVE_SAMPLERATE_KEY , \
  551. CONFIG::INT_TYPE , audio[CONFIG::WAVE_SAMPLERATE_ID]) ; \
  552. if (!wave_n_blocks_is_int) \
  553. Trace::TraceTypeMismatch(audio , CONFIG::WAVE_NBLOCKS_KEY , \
  554. CONFIG::INT_TYPE , audio[CONFIG::WAVE_NBLOCKS_ID]) ; \
  555. if (!wave_blocksize_is_int) \
  556. Trace::TraceTypeMismatch(audio , CONFIG::WAVE_BLOCKSIZE_KEY , \
  557. CONFIG::INT_TYPE , audio[CONFIG::WAVE_BLOCKSIZE_ID]) ; \
  558. if (!mac_device_is_string) \
  559. Trace::TraceTypeMismatch(audio , CONFIG::MAC_DEVICE_KEY , \
  560. CONFIG::STRING_TYPE , audio[CONFIG::MAC_DEVICE_ID]) ; \
  561. if (!mac_n_inputs_is_int) \
  562. Trace::TraceTypeMismatch(audio , CONFIG::MAC_NINPUTS_KEY , \
  563. CONFIG::INT_TYPE , audio[CONFIG::MAC_NINPUTS_ID]) ; \
  564. if (!mac_bitdepth_is_int) \
  565. Trace::TraceTypeMismatch(audio , CONFIG::MAC_BITDEPTH_KEY , \
  566. CONFIG::INT_TYPE , audio[CONFIG::MAC_BITDEPTH_ID]) ; \
  567. if (!mac_samplerate_is_int) \
  568. Trace::TraceTypeMismatch(audio , CONFIG::MAC_SAMPLERATE_KEY , \
  569. CONFIG::INT_TYPE , audio[CONFIG::MAC_SAMPLERATE_ID]) ; \
  570. if (!nix_audio_ifn_is_int) \
  571. Trace::TraceTypeMismatch(audio , CONFIG::NIX_AUDIO_IF_KEY , \
  572. CONFIG::INT_TYPE , audio[CONFIG::NIX_AUDIO_IF_ID]) ; \
  573. if (!jack_server_is_int) \
  574. Trace::TraceTypeMismatch(audio , CONFIG::JACK_SERVER_KEY , \
  575. CONFIG::INT_TYPE , audio[CONFIG::JACK_SERVER_ID]) ; \
  576. if (!jack_name_is_string) \
  577. Trace::TraceTypeMismatch(audio , CONFIG::JACK_NAME_KEY , \
  578. CONFIG::STRING_TYPE , audio[CONFIG::JACK_NAME_ID]) ; \
  579. if (!jack_n_inputs_is_int) \
  580. Trace::TraceTypeMismatch(audio , CONFIG::JACK_NINPUTS_KEY , \
  581. CONFIG::INT_TYPE , audio[CONFIG::JACK_NINPUTS_ID]) ; \
  582. if (!jack_n_outputs_is_int) \
  583. Trace::TraceTypeMismatch(audio , CONFIG::JACK_NOUTPUTS_KEY , \
  584. CONFIG::INT_TYPE , audio[CONFIG::JACK_NOUTPUTS_ID]) ; \
  585. if (!alsa_config_is_string) \
  586. Trace::TraceTypeMismatch(audio , CONFIG::ALSA_CONFIG_KEY , \
  587. CONFIG::STRING_TYPE , audio[CONFIG::ALSA_CONFIG_ID]) ; \
  588. \
  589. /* server datatypes */ \
  590. if (!host_name_is_string) \
  591. Trace::TraceTypeMismatch(server , CONFIG::HOST_KEY , \
  592. CONFIG::STRING_TYPE , server[CONFIG::HOST_ID]) ; \
  593. if (!login_is_string) \
  594. Trace::TraceTypeMismatch(server , CONFIG::LOGIN_KEY , \
  595. CONFIG::STRING_TYPE , server[CONFIG::LOGIN_ID]) ; \
  596. if (!pass_is_string) \
  597. Trace::TraceTypeMismatch(server , CONFIG::PASS_KEY , \
  598. CONFIG::STRING_TYPE , server[CONFIG::PASS_ID]) ; \
  599. if (!is_anon_is_bool) \
  600. Trace::TraceTypeMismatch(server , CONFIG::IS_ANONYMOUS_KEY , \
  601. CONFIG::BOOL_TYPE , server[CONFIG::IS_ANONYMOUS_ID]) ; \
  602. if (!is_agreed_is_bool) \
  603. Trace::TraceTypeMismatch(server , CONFIG::IS_AGREED_KEY , \
  604. CONFIG::BOOL_TYPE , server[CONFIG::IS_AGREED_ID]) ; \
  605. if (!should_agree_is_bool) \
  606. Trace::TraceTypeMismatch(server , CONFIG::SHOULD_AGREE_KEY , \
  607. CONFIG::BOOL_TYPE , server[CONFIG::SHOULD_AGREE_ID]) ; \
  608. \
  609. /* masters datatypes */ \
  610. if (!master_name_is_string) \
  611. Trace::TraceTypeMismatch(master , CONFIG::CHANNEL_NAME_KEY , \
  612. CONFIG::STRING_TYPE , master[CONFIG::CHANNEL_NAME_ID]) ; \
  613. if (!master_volume_is_double) \
  614. Trace::TraceTypeMismatch(master , CONFIG::VOLUME_KEY , \
  615. CONFIG::DOUBLE_TYPE , master[CONFIG::VOLUME_ID]) ; \
  616. if (!master_pan_is_double) \
  617. Trace::TraceTypeMismatch(master , CONFIG::PAN_KEY , \
  618. CONFIG::DOUBLE_TYPE , master[CONFIG::PAN_ID]) ; \
  619. if (!master_mute_is_bool) \
  620. Trace::TraceTypeMismatch(master , CONFIG::IS_MUTED_KEY , \
  621. CONFIG::BOOL_TYPE , master[CONFIG::IS_MUTED_ID]) ; \
  622. if (!master_stereo_is_int) \
  623. Trace::TraceTypeMismatch(master , CONFIG::STEREO_KEY , \
  624. CONFIG::INT_TYPE , master[CONFIG::STEREO_ID]) ; \
  625. if (!master_vuleft_is_double) \
  626. Trace::TraceTypeMismatch(master , CONFIG::VU_LEFT_KEY , \
  627. CONFIG::DOUBLE_TYPE , master[CONFIG::VU_LEFT_ID]) ; \
  628. if (!master_vuright_is_double) \
  629. Trace::TraceTypeMismatch(master , CONFIG::VU_RIGHT_KEY , \
  630. CONFIG::DOUBLE_TYPE , master[CONFIG::VU_RIGHT_ID]) ; \
  631. if (!metro_name_is_string) \
  632. Trace::TraceTypeMismatch(metro , CONFIG::CHANNEL_NAME_KEY , \
  633. CONFIG::STRING_TYPE , metro[CONFIG::CHANNEL_NAME_ID]) ; \
  634. if (!metro_volume_is_double) \
  635. Trace::TraceTypeMismatch(metro , CONFIG::VOLUME_KEY , \
  636. CONFIG::DOUBLE_TYPE , metro[CONFIG::VOLUME_ID]) ; \
  637. if (!metro_pan_is_double) \
  638. Trace::TraceTypeMismatch(metro , CONFIG::PAN_KEY , \
  639. CONFIG::DOUBLE_TYPE , metro[CONFIG::PAN_ID]) ; \
  640. if (!metro_mute_is_bool) \
  641. Trace::TraceTypeMismatch(metro , CONFIG::IS_MUTED_KEY , \
  642. CONFIG::BOOL_TYPE , metro[CONFIG::IS_MUTED_ID]) ; \
  643. if (!metro_source_is_int) \
  644. Trace::TraceTypeMismatch(metro , CONFIG::SOURCE_N_KEY , \
  645. CONFIG::INT_TYPE , metro[CONFIG::SOURCE_N_ID]) ; \
  646. if (!metro_stereo_is_int) \
  647. Trace::TraceTypeMismatch(metro , CONFIG::STEREO_KEY , \
  648. CONFIG::INT_TYPE , metro[CONFIG::STEREO_ID]) ; \
  649. if (!metro_vuleft_is_double) \
  650. Trace::TraceTypeMismatch(metro , CONFIG::VU_LEFT_KEY , \
  651. CONFIG::DOUBLE_TYPE , metro[CONFIG::VU_LEFT_ID]) ; \
  652. if (!metro_vuright_is_double) \
  653. Trace::TraceTypeMismatch(metro , CONFIG::VU_RIGHT_KEY , \
  654. CONFIG::DOUBLE_TYPE , metro[CONFIG::VU_RIGHT_ID]) ; \
  655. \
  656. /* modify return value and/or restore defauilt config */ \
  657. is_valid = is_valid && \
  658. \
  659. /* client properties */ \
  660. client_has_saveaudio_property && client_has_mixdown_property && \
  661. client_has_savelog_property && client_has_debuglevel_property && \
  662. client_has_hide_bots_property && \
  663. \
  664. /* subscriptions properties */ \
  665. subs_has_autosubscribe_property && \
  666. \
  667. /* audio properties */ \
  668. audio_has_winifn_property && \
  669. audio_has_asiodriver_property && audio_has_asioinput0_property && \
  670. audio_has_asioinput1_property && audio_has_asiooutput0_property && \
  671. audio_has_asiooutput1_property && \
  672. audio_has_ksinput_property && audio_has_ksoutput_property && \
  673. audio_has_ksbitdepth_property && audio_has_kssamplerate_property && \
  674. audio_has_ksnblocks_property && audio_has_ksblocksize_property && \
  675. audio_has_dsinput0_property && audio_has_dsinput1_property && \
  676. audio_has_dsinput2_property && audio_has_dsinput3_property && \
  677. audio_has_dsoutput0_property && audio_has_dsoutput1_property && \
  678. audio_has_dsoutput2_property && audio_has_dsoutput3_property && \
  679. audio_has_dsbitdepth_property && audio_has_dssamplerate_property && \
  680. audio_has_dsnblocks_property && audio_has_dsblocksize_property && \
  681. audio_has_waveinput_property && audio_has_waveoutput_property && \
  682. audio_has_wavebitdepth_property && audio_has_wavesamplerate_property && \
  683. audio_has_wavenblocks_property && audio_has_waveblocksize_property && \
  684. audio_has_macdevice_property && audio_has_macninputs_property && \
  685. audio_has_macbitdepth_property && audio_has_macsamplerate_property && \
  686. audio_has_nixifn_property && audio_has_jackserver_property && \
  687. audio_has_jackname_property && audio_has_jackninputs_property && \
  688. audio_has_jacknoutputs_property && audio_has_alsaconfig_property && \
  689. \
  690. /* server properties */ \
  691. server_has_host_property && server_has_login_property && \
  692. server_has_pass_property && server_has_is_anonymous_property && \
  693. server_has_is_agreed_property && server_has_should_agree_property && \
  694. \
  695. /* masters properties */ \
  696. master_channel_has_name_property && master_channel_has_volume_property && \
  697. master_channel_has_pan_property && master_channel_has_mute_property && \
  698. master_channel_has_stereo_property && master_channel_has_vuleft_property && \
  699. master_channel_has_vuright_property && \
  700. metro_channel_has_name_property && metro_channel_has_volume_property && \
  701. metro_channel_has_pan_property && metro_channel_has_mute_property && \
  702. metro_channel_has_source_property && metro_channel_has_stereo_property && \
  703. metro_channel_has_vuleft_property && metro_channel_has_vuleft_property && \
  704. \
  705. /* client datatypes */ \
  706. save_audio_is_int && mixdown_is_int && \
  707. save_log_is_bool && debug_level_is_int && \
  708. should_hide_bots_is_bool && \
  709. \
  710. /* subscriptions properties */ \
  711. autosubscribe_is_int && \
  712. \
  713. /* audio datatypes */ \
  714. win_audio_ifn_is_int && \
  715. asio_driver_is_int && asio_input0_is_int && \
  716. asio_inout1_is_int && asio_output0_is_int && \
  717. asio_output1_is_int && \
  718. ks_input_is_int && ks_output_is_int && \
  719. ks_bitdepth_is_int && ks_samplerate_is_int && \
  720. ks_n_blocks_is_int && ks_blocksize_is_int && \
  721. ds_input0_is_int && ds_input1_is_int && \
  722. ds_input2_is_int && ds_input3_is_int && \
  723. ds_output0_is_int && ds_output1_is_int && \
  724. ds_output2_is_int && ds_output3_is_int && \
  725. ds_bitdepth_is_int && ds_samplerate_is_int && \
  726. ds_n_blocks_is_int && ds_blocksize_is_int && \
  727. wave_input_is_int && wave_output_is_int && \
  728. wave_bitdepth_is_int && wave_samplerate_is_int && \
  729. wave_n_blocks_is_int && wave_blocksize_is_int && \
  730. mac_device_is_string && mac_n_inputs_is_int && \
  731. mac_bitdepth_is_int && mac_samplerate_is_int && \
  732. nix_audio_ifn_is_int && jack_server_is_int && \
  733. jack_name_is_string && jack_n_inputs_is_int && \
  734. jack_n_outputs_is_int && alsa_config_is_string && \
  735. \
  736. /* server datatypes */ \
  737. host_name_is_string && login_is_string && \
  738. pass_is_string && is_anon_is_bool && \
  739. is_agreed_is_bool && should_agree_is_bool && \
  740. \
  741. /* masters datatypes */ \
  742. master_name_is_string && master_volume_is_double && \
  743. master_pan_is_double && master_mute_is_bool && \
  744. master_stereo_is_int && master_vuleft_is_double && \
  745. master_vuright_is_double && \
  746. metro_name_is_string && metro_volume_is_double && \
  747. metro_pan_is_double && metro_mute_is_bool && \
  748. metro_source_is_int && metro_stereo_is_int && \
  749. metro_vuleft_is_double && metro_vuright_is_double ;
  750. /*
  751. #define DEBUG_TRACE_SANITY_CHECK_USER \
  752. String user_name = String(channels.getType()) ; \
  753. if (!remote_has_useridx_property) \
  754. Trace::TraceMissingProperty(user_name , CONFIG::USERIDX_KEY) ; \
  755. if (!remote_has_useridx_property) \
  756. Trace::TraceError("destroying invalid remote channel store '" + user_name + "'") ;
  757. */
  758. #define DEBUG_TRACE_SANITY_CHECK_CHANNEL \
  759. String channels_name = String(channels.getType()) ; \
  760. String channel_name = channel[CONFIG::CHANNEL_NAME_ID].toString() ; \
  761. \
  762. /* channel datatypes */ \
  763. /* NOTE: these type-checks normally should be unnecessary */ \
  764. /* all tree nodes will be of the proper types after restoreVarTypeInfo() */ \
  765. bool channel_name_is_string = channel[CONFIG::CHANNEL_NAME_ID].isString() ; \
  766. bool channel_idx_is_int = channel[CONFIG::CHANNEL_IDX_ID] .isInt() ; \
  767. bool channel_pair_idx_is_int = channel[CONFIG::PAIR_IDX_ID] .isInt() ; \
  768. bool channel_volume_is_double = channel[CONFIG::VOLUME_ID] .isDouble() ; \
  769. bool channel_pan_is_double = channel[CONFIG::PAN_ID] .isDouble() ; \
  770. bool channel_xmit_is_bool = channel[CONFIG::IS_XMIT_RCV_ID] .isBool() ; \
  771. bool channel_mute_is_bool = channel[CONFIG::IS_MUTED_ID] .isBool() ; \
  772. bool channel_solo_is_bool = channel[CONFIG::IS_SOLO_ID] .isBool() ; \
  773. bool channel_source_is_int = channel[CONFIG::SOURCE_N_ID] .isInt() ; \
  774. bool channel_stereo_is_int = channel[CONFIG::STEREO_ID] .isInt() ; \
  775. bool channel_vuleft_is_double = channel[CONFIG::VU_LEFT_ID] .isDouble() ; \
  776. bool channel_vuright_is_double = channel[CONFIG::VU_RIGHT_ID] .isDouble() ; \
  777. \
  778. /* channel properties */ \
  779. if (!channel_has_channelname_property) \
  780. Trace::TraceMissingProperty(channel_name , CONFIG::CHANNEL_NAME_KEY , channels_name) ; \
  781. if (!channel_has_channelidx_property) \
  782. Trace::TraceMissingProperty(channel_name , CONFIG::CHANNEL_IDX_KEY , channels_name) ; \
  783. if (!channel_has_pairidx_property) \
  784. Trace::TraceMissingProperty(channel_name , CONFIG::PAIR_IDX_KEY , channels_name) ; \
  785. if (!channel_has_volume_property) \
  786. Trace::TraceMissingProperty(channel_name , CONFIG::VOLUME_KEY , channels_name) ; \
  787. if (!channel_has_pan_property) \
  788. Trace::TraceMissingProperty(channel_name , CONFIG::PAN_KEY , channels_name) ; \
  789. if (!channel_has_xmit_property) \
  790. Trace::TraceMissingProperty(channel_name , CONFIG::IS_XMIT_RCV_KEY , channels_name) ; \
  791. if (!channel_has_mute_property) \
  792. Trace::TraceMissingProperty(channel_name , CONFIG::IS_MUTED_KEY , channels_name) ; \
  793. if (!channel_has_solo_property) \
  794. Trace::TraceMissingProperty(channel_name , CONFIG::IS_SOLO_KEY , channels_name) ; \
  795. if (!channel_has_source_property) \
  796. Trace::TraceMissingProperty(channel_name , CONFIG::SOURCE_N_KEY , channels_name) ; \
  797. if (!channel_has_stereo_property) \
  798. Trace::TraceMissingProperty(channel_name , CONFIG::STEREO_KEY , channels_name) ; \
  799. if (!channel_has_vuleft_property) \
  800. Trace::TraceMissingProperty(channel_name , CONFIG::VU_LEFT_KEY , channels_name) ; \
  801. if (!channel_has_vuright_property) \
  802. Trace::TraceMissingProperty(channel_name , CONFIG::VU_RIGHT_KEY , channels_name) ; \
  803. \
  804. /* channel datatypes */ \
  805. if (!channel_name_is_string) \
  806. Trace::TraceTypeMismatch(channel , CONFIG::CHANNEL_NAME_KEY , \
  807. CONFIG::STRING_TYPE , channel[CONFIG::CHANNEL_NAME_ID] , \
  808. channels_name ) ; \
  809. if (!channel_idx_is_int) \
  810. Trace::TraceTypeMismatch(channel , CONFIG::CHANNEL_IDX_KEY , \
  811. CONFIG::INT_TYPE , channel[CONFIG::CHANNEL_IDX_ID] , \
  812. channels_name ) ; \
  813. if (!channel_pair_idx_is_int) \
  814. Trace::TraceTypeMismatch(channel , CONFIG::PAIR_IDX_KEY , \
  815. CONFIG::INT_TYPE , channel[CONFIG::PAIR_IDX_ID] , \
  816. channels_name ) ; \
  817. if (!channel_volume_is_double) \
  818. Trace::TraceTypeMismatch(channel , CONFIG::VOLUME_KEY , \
  819. CONFIG::DOUBLE_TYPE , channel[CONFIG::VOLUME_ID] , \
  820. channels_name ) ; \
  821. if (!channel_pan_is_double) \
  822. Trace::TraceTypeMismatch(channel , CONFIG::PAN_KEY , \
  823. CONFIG::DOUBLE_TYPE , channel[CONFIG::PAN_ID] , \
  824. channels_name ) ; \
  825. if (!channel_xmit_is_bool) \
  826. Trace::TraceTypeMismatch(channel , CONFIG::IS_XMIT_RCV_KEY , \
  827. CONFIG::BOOL_TYPE , channel[CONFIG::IS_XMIT_RCV_ID] , \
  828. channels_name ) ; \
  829. if (!channel_mute_is_bool) \
  830. Trace::TraceTypeMismatch(channel , CONFIG::IS_MUTED_KEY , \
  831. CONFIG::BOOL_TYPE , channel[CONFIG::IS_MUTED_ID] , \
  832. channels_name ) ; \
  833. if (!channel_solo_is_bool) \
  834. Trace::TraceTypeMismatch(channel , CONFIG::IS_SOLO_KEY , \
  835. CONFIG::BOOL_TYPE , channel[CONFIG::IS_SOLO_ID] , \
  836. channels_name ) ; \
  837. if (!channel_source_is_int) \
  838. Trace::TraceTypeMismatch(channel , CONFIG::SOURCE_N_KEY , \
  839. CONFIG::INT_TYPE , channel[CONFIG::SOURCE_N_ID] , \
  840. channels_name ) ; \
  841. if (!channel_stereo_is_int) \
  842. Trace::TraceTypeMismatch(channel , CONFIG::STEREO_KEY , \
  843. CONFIG::INT_TYPE , channel[CONFIG::STEREO_ID] , \
  844. channels_name ) ; \
  845. if (!channel_vuleft_is_double) \
  846. Trace::TraceTypeMismatch(channel , CONFIG::VU_LEFT_KEY , \
  847. CONFIG::DOUBLE_TYPE , channel[CONFIG::VU_LEFT_KEY] , \
  848. channels_name ) ; \
  849. if (!channel_vuright_is_double) \
  850. Trace::TraceTypeMismatch(channel , CONFIG::VU_RIGHT_KEY , \
  851. CONFIG::DOUBLE_TYPE , channel[CONFIG::VU_RIGHT_KEY] , \
  852. channels_name ) ; \
  853. \
  854. /* channel properties */ \
  855. if (!channel_has_channelname_property || !channel_has_channelidx_property || \
  856. !channel_has_pairidx_property || !channel_has_volume_property || \
  857. !channel_has_pan_property || !channel_has_xmit_property || \
  858. !channel_has_mute_property || !channel_has_solo_property || \
  859. !channel_has_source_property || !channel_has_stereo_property || \
  860. !channel_has_vuleft_property || !channel_has_vuright_property ) \
  861. Trace::TraceError("destroying invalid local channel store '" + channel_name + "'") ;
  862. #if TRACE_STORE_CONFIG_VB
  863. # define DEBUG_TRACE_STORE_CONFIG Trace::TraceConfig("storing config xml=\n" + \
  864. configValueTree.toXmlString()) ;
  865. #else // TRACE_STORE_CONFIG_VB
  866. # define DEBUG_TRACE_STORE_CONFIG Trace::TraceConfig("storing config xml") ;
  867. #endif // TRACE_STORE_CONFIG_VB
  868. #define DEBUG_TRACE_CONFIG_VALUE_CHANGED \
  869. String a_var = (a_value.refersToSameSourceAs(LinJam::Status))? "Status" : "unknown" ; \
  870. String status = Trace::Status2String(int(LinJam::Status.getValue())) ; \
  871. Trace::TraceEvent("value changed => " + a_var + " => " + status) ;
  872. #define DEBUG_TRACE_CONFIG_TREE_CHANGED \
  873. String node = String(a_node.getType()) ; \
  874. String parent = String(a_node.getParent().getType()) ; \
  875. String key = String(a_key) ; \
  876. String val = a_node[a_key].toString() ; \
  877. if (a_key != CONFIG::VU_LEFT_ID && a_key != CONFIG::VU_RIGHT_ID) \
  878. Trace::TraceEvent("value changed for " + parent + \
  879. " => " + node + "[" + key + "] => " + val) ;
  880. #define DEBUG_TRACE_CONFIG_TREE_ADDED \
  881. if (a_parent_node == this->subscriptions) \
  882. Trace::TraceEvent("node added to " + String(a_parent_node.getType()) + \
  883. " => " + String(a_node.getType())) ;
  884. #define DEBUG_TRACE_CONFIG_TREE_REMOVED \
  885. if (a_parent_node == this->subscriptions) \
  886. Trace::TraceEvent("node removed from " + String(a_parent_node.getType()) + \
  887. " => " + String(a_node.getType())) ;
  888. /* channels */
  889. #define DEBUG_TRACE_STEREO_STATUS \
  890. String status = (stereo_status == CONFIG::STEREO_L)? "STEREO_L" : \
  891. (stereo_status == CONFIG::STEREO_R)? "STEREO_R" : "MONO" + \
  892. String((is_paired)? " (paired)" : " (unpaired)") ; \
  893. String pair_status = ((pair_stereo_status == CONFIG::STEREO_L)? \
  894. "STEREO_L" : "STEREO_R") + String(" (paired)") ; \
  895. String dbgA = "setting remote channel '" ; String dbgB = "' status to " ; \
  896. if (is_paired) Trace::TraceConfig(dbgA + pair_name + dbgB + pair_status) ; \
  897. Trace::TraceConfig(dbgA + channel_name + dbgB + status) ;
  898. #define DEBUG_TRACE_MONO_STATUS \
  899. String dbgA = "setting remote channel '" ; String dbgB = "' status to MONO" ; \
  900. String pair_name = (has_l_pair)? l_pair_name : r_pair_name ; \
  901. if (has_orphaned_pair) \
  902. Trace::TraceConfig(dbgA + pair_name + dbgB + " (orphaned)") ; \
  903. if (parseStereoStatus(channel_name) == CONFIG::MONO) \
  904. Trace::TraceConfig(dbgA + channel_name + dbgB) ;
  905. #define DEBUG_TRACE_ADD_CHANNEL_STORE \
  906. String user_id = String(channels_store.getType()) ; \
  907. int ch_idx = int(new_channel_node[CONFIG::CHANNEL_IDX_ID]) ; \
  908. String channel_id = String(makeChannelId(ch_idx)) ; \
  909. String channel_name = LinJam::GetStoredChannelName(new_channel_node) ; \
  910. bool is_local = channels_store == this->localChannels ; \
  911. String group = (is_local)? "local" : "remote" ; \
  912. String dbgA = "created storage for new " ; \
  913. String dbgB = group + " " + channel_id + " '" + channel_name + "'" ; \
  914. if (!channels_store.isValid()) \
  915. Trace::TraceError("invlaid parent creating channel storage for '" + dbgB) ; \
  916. else if (!new_channel_node.isValid()) \
  917. Trace::TraceError("invlaid node creating " + user_id + " channel storage") ; \
  918. if (new_channel_node.getParent() == channels_store) \
  919. Trace::TraceConfig("storage exists for " + dbgB) ; \
  920. else if (is_local) \
  921. Trace::TraceConfig(dbgA + dbgB) ; \
  922. else Trace::TraceConfig(dbgA + dbgB + " for '" + user_id + "'") ; \
  923. if (TRACE_LOCAL_CHANNELS_VB) \
  924. DBG(Trace::DumpStoredChannels() + Trace::DumpClientChannels()) ;
  925. #define DEBUG_TRACE_DESTROY_CHANNEL_STORE \
  926. String channel_id = String(channel_store.getType()) ; \
  927. String channel_name = channel_store[CONFIG::CHANNEL_NAME_ID].toString() ; \
  928. String user_id = String(channels_store.getType()) ; \
  929. String dbgA = "destroyed storage for " ; \
  930. String dbgB = " " + channel_id + " '" + channel_name + "' " ; \
  931. if (channel_store.getParent() == channels_store) \
  932. if (channels_store == this->localChannels) \
  933. Trace::TraceConfig(dbgA + "local" + dbgB) ; \
  934. else Trace::TraceConfig(dbgA + "remote" + dbgB + "for '" + user_id + "'") ;
  935. #define DEBUG_TRACE_ADD_REMOTE_USER_STORE \
  936. Trace::TraceEvent("user joined => '" + String(user_id) + "'") ; \
  937. Trace::TraceConfig("created storage for new remote user " + String(user_id)) ; \
  938. if (TRACE_REMOTE_CHANNELS_VB) \
  939. { \
  940. char* host = LinJam::Client->GetHostName() ; \
  941. bool has_bot = NETWORK::KNOWN_HOSTS.contains(String(host)) ; \
  942. bool hide_bots = has_bot && bool(this->client[CONFIG::SHOULD_HIDE_BOTS_ID]) ; \
  943. float u_vol = CONFIG::DEFAULT_VOLUME ; \
  944. bool u_mute = CONFIG::DEFAULT_IS_MUTED ; \
  945. float u_pan = CONFIG::DEFAULT_PAN ; \
  946. int u_idx = -1 ; String u_name ; Identifier u_id ; \
  947. while ((u_name = LinJam::GetRemoteUserName(++u_idx)).isNotEmpty()) \
  948. { u_id = makeUserId(u_name) ; if (user_id == u_id) break ; } \
  949. DEBUG_TRACE_REMOTE_CHANNELS \
  950. }
  951. #else // DEBUG
  952. // storage
  953. #define DEBUG_TRACE_LOAD_CONFIG ;
  954. #define DEBUG_TRACE_SANITIZE_CONFIG ;
  955. #define DEBUG_TRACE_CONFIG_TYPES_VB ;
  956. #define DEBUG_TRACE_SANITY_CHECK ;
  957. //#define DEBUG_TRACE_SANITY_CHECK_USER ;
  958. #define DEBUG_TRACE_SANITY_CHECK_CHANNEL ;
  959. #define DEBUG_TRACE_STORE_CONFIG ;
  960. #define DEBUG_TRACE_CONFIG_TREE_CHANGED ;
  961. #define DEBUG_TRACE_CONFIG_TREE_ADDED ;
  962. #define DEBUG_TRACE_CONFIG_TREE_REMOVED ;
  963. // channels
  964. #define DEBUG_TRACE_STEREO_STATUS ;
  965. #define DEBUG_TRACE_MONO_STATUS ;
  966. #define DEBUG_TRACE_ADD_CHANNEL_STORE ;
  967. #define DEBUG_TRACE_DESTROY_CHANNEL_STORE ;
  968. #define DEBUG_TRACE_ADD_REMOTE_USER_STORE ;
  969. #endif // DEBUG