TraceLinJamConfig.h 92 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122
  1. #if DEBUG
  2. #include "TraceLinJam.h"
  3. /* storage */
  4. #define DEBUG_TRACE_LOAD_CONFIG \
  5. if (default_xml == nullptr || !default_xml->hasTagName(CONFIG::STORAGE_ID)) \
  6. Trace::TraceConfig("default config invalid - bailing") ; \
  7. else Trace::TraceConfig("default config loaded") ; \
  8. if (stored_xml == nullptr) \
  9. Trace::TraceConfig("stored config not found - falling back on defaults") ; \
  10. else if (!stored_xml->hasTagName(CONFIG::STORAGE_ID)) \
  11. Trace::TraceConfig("stored config is invalid - falling back on defaults") ; \
  12. else Trace::TraceConfig("stored config found") ;
  13. #define DEBUG_TRACE_DUMP_CONFIG \
  14. String latest_version = String(CONFIG::CONFIG_VERSION) ; \
  15. String success_msg = "stored config parsed successfully v" + String(stored_version) ; \
  16. String fail_msg = "stored config not found" ; \
  17. Trace::TraceConfig(((has_stored_config) ? success_msg : fail_msg ) + \
  18. ((do_versions_match) ? "" : \
  19. " (latest is v" + latest_version + " - restoring defualts)") ) ; \
  20. if (TRACE_DUMP_CONFIG && has_stored_config) \
  21. Trace::TraceConfig(Trace::DumpConfig(ValueTree::fromXml(*default_xml) , \
  22. ValueTree::fromXml(*stored_xml) , " ")) ;
  23. #if TRACE_CONFIG_TYPES
  24. # define DEBUG_TRACE_CONFIG_TYPES_VB \
  25. String parent_id = (node_id == CONFIG::STORAGE_ID) ? "root::" : \
  26. (grandparent_node == this->remoteUsers) ? \
  27. CONFIG::REMOTES_KEY + " " + String(parent_node.getType()) : \
  28. String(parent_node.getType()) ; \
  29. String restore_msg = "restoring types for " + parent_id + "::" + String(node_id) ; \
  30. int n_properties = config_store.getNumProperties() ; \
  31. int n_children = config_store.getNumChildren() ; \
  32. if (!types_store.isValid() && !!n_properties) \
  33. Trace::TraceError("error " + restore_msg + " - missing CONFIG_TYPES") ; \
  34. else \
  35. Trace::TraceConfig(restore_msg + " (" + String(n_properties) + " properties - " + \
  36. String(n_children ) + " children)" ) ;
  37. # define DEBUG_TRACE_CONFIG_TYPES_VB_EACH \
  38. bool is_valid = is_bool || is_double || is_int || is_string ; \
  39. String type = (is_valid) ? Trace::VarType(config_store[key]) : "(deleted)" ; \
  40. Trace::TraceConfig(" " + String(key).paddedRight(' ' , 20) + " => " + type) ;
  41. #else // TRACE_CONFIG_TYPES
  42. # define DEBUG_TRACE_CONFIG_TYPES_VB ;
  43. # define DEBUG_TRACE_CONFIG_TYPES_VB_EACH ;
  44. #endif // TRACE_CONFIG_TYPES
  45. #define DEBUG_TRACE_VALIDATE_USER \
  46. String user_name = String(user_store.getType()) ; \
  47. if (!user_has_useridx_property) \
  48. { \
  49. Trace::TraceMissingProperty(user_name , CONFIG::USER_IDX_KEY) ; \
  50. Trace::TraceError("destroying invalid remote channel store '" + user_name + "'") ; \
  51. }
  52. #define DEBUG_TRACE_VALIDATE_CHANNEL \
  53. String channels_name = String(channels.getType()) ; \
  54. String channel_name = LinJam::GetStoredChannelName(channel) ; \
  55. \
  56. /* query channel datatypes */ \
  57. bool channel_name_is_string = channel[CONFIG::CHANNEL_NAME_ID].isString() ; \
  58. bool channel_idx_is_int = channel[CONFIG::CHANNEL_IDX_ID] .isInt() ; \
  59. bool channel_pair_idx_is_int = channel[CONFIG::PAIR_IDX_ID] .isInt() ; \
  60. bool channel_volume_is_double = channel[CONFIG::VOLUME_ID] .isDouble() ; \
  61. bool channel_pan_is_double = channel[CONFIG::PAN_ID] .isDouble() ; \
  62. bool channel_xmit_is_bool = channel[CONFIG::IS_XMIT_RCV_ID] .isBool() ; \
  63. bool channel_mute_is_bool = channel[CONFIG::IS_MUTED_ID] .isBool() ; \
  64. bool channel_solo_is_bool = channel[CONFIG::IS_SOLO_ID] .isBool() ; \
  65. bool channel_source_is_int = channel[CONFIG::SOURCE_N_ID] .isInt() ; \
  66. bool channel_stereo_is_int = channel[CONFIG::STEREO_ID] .isInt() ; \
  67. bool channel_vuleft_is_double = channel[CONFIG::VU_LEFT_ID] .isDouble() ; \
  68. bool channel_vuright_is_double = channel[CONFIG::VU_RIGHT_ID] .isDouble() ; \
  69. \
  70. /* trace missing channel properties */ \
  71. if (!channel_has_channelname_property) \
  72. Trace::TraceMissingProperty(channel_name , CONFIG::CHANNEL_NAME_KEY , channels_name) ; \
  73. if (!channel_has_channelidx_property) \
  74. Trace::TraceMissingProperty(channel_name , CONFIG::CHANNEL_IDX_KEY , channels_name) ; \
  75. if (!channel_has_pairidx_property) \
  76. Trace::TraceMissingProperty(channel_name , CONFIG::PAIR_IDX_KEY , channels_name) ; \
  77. if (!channel_has_volume_property) \
  78. Trace::TraceMissingProperty(channel_name , CONFIG::VOLUME_KEY , channels_name) ; \
  79. if (!channel_has_pan_property) \
  80. Trace::TraceMissingProperty(channel_name , CONFIG::PAN_KEY , channels_name) ; \
  81. if (!channel_has_xmit_property) \
  82. Trace::TraceMissingProperty(channel_name , CONFIG::IS_XMIT_RCV_KEY , channels_name) ; \
  83. if (!channel_has_mute_property) \
  84. Trace::TraceMissingProperty(channel_name , CONFIG::IS_MUTED_KEY , channels_name) ; \
  85. if (!channel_has_solo_property) \
  86. Trace::TraceMissingProperty(channel_name , CONFIG::IS_SOLO_KEY , channels_name) ; \
  87. if (!channel_has_source_property) \
  88. Trace::TraceMissingProperty(channel_name , CONFIG::SOURCE_N_KEY , channels_name) ; \
  89. if (!channel_has_stereo_property) \
  90. Trace::TraceMissingProperty(channel_name , CONFIG::STEREO_KEY , channels_name) ; \
  91. if (!channel_has_vuleft_property) \
  92. Trace::TraceMissingProperty(channel_name , CONFIG::VU_LEFT_KEY , channels_name) ; \
  93. if (!channel_has_vuright_property) \
  94. Trace::TraceMissingProperty(channel_name , CONFIG::VU_RIGHT_KEY , channels_name) ; \
  95. \
  96. /* trace invalid channel datatypes */ \
  97. if (!channel_name_is_string) \
  98. Trace::TraceTypeMismatch(channel , CONFIG::CHANNEL_NAME_KEY , \
  99. CONFIG::STRING_TYPE , channel[CONFIG::CHANNEL_NAME_ID] , \
  100. channels_name ) ; \
  101. if (!channel_idx_is_int) \
  102. Trace::TraceTypeMismatch(channel , CONFIG::CHANNEL_IDX_KEY , \
  103. CONFIG::INT_TYPE , channel[CONFIG::CHANNEL_IDX_ID ] , \
  104. channels_name ) ; \
  105. if (!channel_pair_idx_is_int) \
  106. Trace::TraceTypeMismatch(channel , CONFIG::PAIR_IDX_KEY , \
  107. CONFIG::INT_TYPE , channel[CONFIG::PAIR_IDX_ID ] , \
  108. channels_name ) ; \
  109. if (!channel_volume_is_double) \
  110. Trace::TraceTypeMismatch(channel , CONFIG::VOLUME_KEY , \
  111. CONFIG::DOUBLE_TYPE , channel[CONFIG::VOLUME_ID ] , \
  112. channels_name ) ; \
  113. if (!channel_pan_is_double) \
  114. Trace::TraceTypeMismatch(channel , CONFIG::PAN_KEY , \
  115. CONFIG::DOUBLE_TYPE , channel[CONFIG::PAN_ID ] , \
  116. channels_name ) ; \
  117. if (!channel_xmit_is_bool) \
  118. Trace::TraceTypeMismatch(channel , CONFIG::IS_XMIT_RCV_KEY , \
  119. CONFIG::BOOL_TYPE , channel[CONFIG::IS_XMIT_RCV_ID ] , \
  120. channels_name ) ; \
  121. if (!channel_mute_is_bool) \
  122. Trace::TraceTypeMismatch(channel , CONFIG::IS_MUTED_KEY , \
  123. CONFIG::BOOL_TYPE , channel[CONFIG::IS_MUTED_ID ] , \
  124. channels_name ) ; \
  125. if (!channel_solo_is_bool) \
  126. Trace::TraceTypeMismatch(channel , CONFIG::IS_SOLO_KEY , \
  127. CONFIG::BOOL_TYPE , channel[CONFIG::IS_SOLO_ID ] , \
  128. channels_name ) ; \
  129. if (!channel_source_is_int) \
  130. Trace::TraceTypeMismatch(channel , CONFIG::SOURCE_N_KEY , \
  131. CONFIG::INT_TYPE , channel[CONFIG::SOURCE_N_ID ] , \
  132. channels_name ) ; \
  133. if (!channel_stereo_is_int) \
  134. Trace::TraceTypeMismatch(channel , CONFIG::STEREO_KEY , \
  135. CONFIG::INT_TYPE , channel[CONFIG::STEREO_ID ] , \
  136. channels_name ) ; \
  137. if (!channel_vuleft_is_double) \
  138. Trace::TraceTypeMismatch(channel , CONFIG::VU_LEFT_KEY , \
  139. CONFIG::DOUBLE_TYPE , channel[CONFIG::VU_LEFT_KEY ] , \
  140. channels_name ) ; \
  141. if (!channel_vuright_is_double) \
  142. Trace::TraceTypeMismatch(channel , CONFIG::VU_RIGHT_KEY , \
  143. CONFIG::DOUBLE_TYPE , channel[CONFIG::VU_RIGHT_KEY ] , \
  144. channels_name ) ; \
  145. \
  146. /* validate channel properties */ \
  147. if (!channel_has_channelname_property || !channel_has_channelidx_property || \
  148. !channel_has_pairidx_property || !channel_has_volume_property || \
  149. !channel_has_pan_property || !channel_has_xmit_property || \
  150. !channel_has_mute_property || !channel_has_solo_property || \
  151. !channel_has_source_property || !channel_has_stereo_property || \
  152. !channel_has_vuleft_property || !channel_has_vuright_property ) \
  153. Trace::TraceError("destroying invalid " + channels_name + \
  154. " channel store '" + channel_name + "'") ;
  155. #define DEBUG_VALIDATE_CONFIG_DEFAULTS \
  156. /* query default values */ \
  157. bool has_valid_version_declaration = CONFIG::CONFIG_VERSION > 0.0 ; \
  158. bool has_valid_sessiondir_declaration = CLIENT::SESSION_DIRNAME.isNotEmpty() ; \
  159. bool has_valid_logfile_declaration = CLIENT::LOG_FILENAME .isNotEmpty() ; \
  160. \
  161. /* trace invalid default values */ \
  162. if (!has_valid_version_declaration) \
  163. Trace::TraceInvalidDefault(CONFIG::CONFIG_VERSION_KEY) ; \
  164. if (!has_valid_sessiondir_declaration) \
  165. Trace::TraceInvalidDefault("CLIENT::SESSION_DIRNAME") ; \
  166. if (!has_valid_logfile_declaration) \
  167. Trace::TraceInvalidDefault("CLIENT::LOG_FILENAME") ; \
  168. \
  169. /* modify return value */ \
  170. is_valid = is_valid && \
  171. has_valid_version_declaration && has_valid_sessiondir_declaration && \
  172. has_valid_logfile_declaration ;
  173. #define DEBUG_VALIDATE_CONFIG_ROOT \
  174. /* query root properties */ \
  175. bool root_has_configversion_property = root.hasProperty(CONFIG::CONFIG_VERSION_ID) ; \
  176. \
  177. /* query root datatypes */ \
  178. bool config_version_is_double = root[CONFIG::CONFIG_VERSION_ID].isDouble() ; \
  179. \
  180. /* trace missing root properties */ \
  181. if (!root_has_configversion_property) \
  182. Trace::TraceMissingProperty(CONFIG::STORAGE_KEY , CONFIG::CONFIG_VERSION_KEY) ; \
  183. \
  184. /* trace invalid root datatypes */ \
  185. if (!config_version_is_double) \
  186. Trace::TraceTypeMismatch(root , CONFIG::CONFIG_VERSION_KEY , \
  187. CONFIG::DOUBLE_TYPE , root[CONFIG::CONFIG_VERSION_ID] ) ; \
  188. \
  189. /* modify return value */ \
  190. is_valid = is_valid && \
  191. root_has_configversion_property && config_version_is_double ;
  192. #define DEBUG_VALIDATE_CONFIG_GUI \
  193. /* query gui properties */ \
  194. bool gui_has_fontsize_property = gui.hasProperty(CONFIG::FONT_SIZE_ID ) ; \
  195. bool gui_has_updateivl_property = gui.hasProperty(CONFIG::UPDATE_IVL_ID) ; \
  196. \
  197. /* query gui datatypes */ \
  198. bool fontsize_is_int = gui[CONFIG::FONT_SIZE_ID ].isInt() ; \
  199. bool updateivl_is_int = gui[CONFIG::UPDATE_IVL_ID].isInt() ; \
  200. \
  201. /* trace missing gui properties */ \
  202. if (!gui_has_fontsize_property) \
  203. Trace::TraceMissingProperty(CONFIG::GUI_KEY , CONFIG::FONT_SIZE_KEY ) ; \
  204. if (!gui_has_updateivl_property) \
  205. Trace::TraceMissingProperty(CONFIG::GUI_KEY , CONFIG::UPDATE_IVL_KEY) ; \
  206. \
  207. /* trace gui datatypes */ \
  208. if (!fontsize_is_int) \
  209. Trace::TraceTypeMismatch(gui , CONFIG::FONT_SIZE_KEY , \
  210. CONFIG::INT_TYPE , client[CONFIG::FONT_SIZE_ID ] ) ; \
  211. if (!updateivl_is_int) \
  212. Trace::TraceTypeMismatch(gui , CONFIG::UPDATE_IVL_KEY , \
  213. CONFIG::INT_TYPE , client[CONFIG::UPDATE_IVL_ID] ) ; \
  214. \
  215. /* modify return value */ \
  216. is_valid = is_valid && \
  217. gui_has_fontsize_property && fontsize_is_int && \
  218. gui_has_updateivl_property && updateivl_is_int ;
  219. #define DEBUG_VALIDATE_CONFIG_CLIENT \
  220. /* query client properties */ \
  221. bool client_has_saveaudio_property = client.hasProperty(CONFIG::SAVE_AUDIO_MODE_ID ) ; \
  222. bool client_has_mixdown_property = client.hasProperty(CONFIG::MIXDOWN_MODE_KEY ) ; \
  223. bool client_has_savelog_property = client.hasProperty(CONFIG::SHOULD_SAVE_LOG_ID ) ; \
  224. bool client_has_debuglevel_property = client.hasProperty(CONFIG::DEBUG_LEVEL_ID ) ; \
  225. bool client_has_hide_bots_property = client.hasProperty(CONFIG::SHOULD_HIDE_BOTS_ID) ; \
  226. \
  227. /* query client datatypes */ \
  228. bool save_audio_is_int = client[CONFIG::SAVE_AUDIO_MODE_ID ].isInt() ; \
  229. bool mixdown_is_int = client[CONFIG::MIXDOWN_MODE_KEY ].isInt() ; \
  230. bool save_log_is_bool = client[CONFIG::SHOULD_SAVE_LOG_ID ].isBool() ; \
  231. bool debug_level_is_int = client[CONFIG::DEBUG_LEVEL_ID ].isInt() ; \
  232. bool should_hide_bots_is_bool = client[CONFIG::SHOULD_HIDE_BOTS_ID].isBool() ; \
  233. \
  234. /* trace missing client properties */ \
  235. if (!client_has_saveaudio_property) \
  236. Trace::TraceMissingProperty(CONFIG::CLIENT_KEY , CONFIG::SAVE_AUDIO_MODE_KEY ) ; \
  237. if (!client_has_mixdown_property) \
  238. Trace::TraceMissingProperty(CONFIG::CLIENT_KEY , CONFIG::MIXDOWN_MODE_KEY ) ; \
  239. if (!client_has_savelog_property) \
  240. Trace::TraceMissingProperty(CONFIG::CLIENT_KEY , CONFIG::SHOULD_SAVE_LOG_KEY ) ; \
  241. if (!client_has_debuglevel_property) \
  242. Trace::TraceMissingProperty(CONFIG::CLIENT_KEY , CONFIG::DEBUG_LEVEL_KEY ) ; \
  243. if (!client_has_hide_bots_property) \
  244. Trace::TraceMissingProperty(CONFIG::CLIENT_KEY , CONFIG::SHOULD_HIDE_BOTS_KEY) ; \
  245. \
  246. /* trace invalid client datatypes */ \
  247. if (!save_audio_is_int) \
  248. Trace::TraceTypeMismatch(client , CONFIG::SAVE_AUDIO_MODE_KEY , \
  249. CONFIG::INT_TYPE , client[CONFIG::SAVE_AUDIO_MODE_ID ] ) ; \
  250. if (!mixdown_is_int) \
  251. Trace::TraceTypeMismatch(client , CONFIG::MIXDOWN_MODE_KEY , \
  252. CONFIG::INT_TYPE , client[CONFIG::MIXDOWN_MODE_KEY ] ) ; \
  253. if (!save_log_is_bool) \
  254. Trace::TraceTypeMismatch(client , CONFIG::SHOULD_SAVE_LOG_KEY , \
  255. CONFIG::BOOL_TYPE , client[CONFIG::SHOULD_SAVE_LOG_ID ] ) ; \
  256. if (!debug_level_is_int) \
  257. Trace::TraceTypeMismatch(client , CONFIG::DEBUG_LEVEL_KEY , \
  258. CONFIG::INT_TYPE , client[CONFIG::DEBUG_LEVEL_ID ] ) ; \
  259. if (!should_hide_bots_is_bool) \
  260. Trace::TraceTypeMismatch(client , CONFIG::SHOULD_HIDE_BOTS_KEY , \
  261. CONFIG::BOOL_TYPE , client[CONFIG::SHOULD_HIDE_BOTS_ID] ) ; \
  262. \
  263. /* modify return value */ \
  264. is_valid = is_valid && \
  265. client_has_saveaudio_property && save_audio_is_int && \
  266. client_has_mixdown_property && mixdown_is_int && \
  267. client_has_savelog_property && save_log_is_bool && \
  268. client_has_debuglevel_property && debug_level_is_int && \
  269. client_has_hide_bots_property && should_hide_bots_is_bool ;
  270. #define DEBUG_VALIDATE_CONFIG_BLACKLIST \
  271. /* query blacklist properties */ \
  272. bool blacklist_has_mode_property = blacklist.hasProperty(CONFIG::SUBSCRIBE_MODE_ID) ; \
  273. \
  274. /* query blacklist datatypes */ \
  275. bool subscribemode_is_int = blacklist[CONFIG::SUBSCRIBE_MODE_ID].isInt() ; \
  276. \
  277. /* trace missing blacklist properties */ \
  278. if (!blacklist_has_mode_property) \
  279. Trace::TraceMissingProperty(CONFIG::BLACKLIST_KEY , CONFIG::SUBSCRIBE_MODE_KEY) ; \
  280. \
  281. /* trace blacklist datatypes */ \
  282. if (!subscribemode_is_int) \
  283. Trace::TraceTypeMismatch(blacklist , CONFIG::SUBSCRIBE_MODE_KEY , \
  284. CONFIG::INT_TYPE , client[CONFIG::SUBSCRIBE_MODE_ID] ) ; \
  285. \
  286. /* modify return value */ \
  287. is_valid = is_valid && \
  288. blacklist_has_mode_property && subscribemode_is_int ;
  289. # define DEBUG_VALIDATE_CONFIG_AUDIO_WIN \
  290. /* query win audio properties */ \
  291. bool audio_has_api_property = \
  292. audio.hasProperty(CONFIG::AUDIO_API_ID ) ; \
  293. bool audio_has_asiodriver_property = \
  294. audio.hasProperty(CONFIG::ASIO_DRIVER_ID ) ; \
  295. bool audio_has_asioinputb_property = \
  296. audio.hasProperty(CONFIG::ASIO_INPUTB_ID ) ; \
  297. bool audio_has_asioinpute_property = \
  298. audio.hasProperty(CONFIG::ASIO_INPUTE_ID ) ; \
  299. bool audio_has_asiooutputb_property = \
  300. audio.hasProperty(CONFIG::ASIO_OUTPUTB_ID ) ; \
  301. bool audio_has_asiooutpute_property = \
  302. audio.hasProperty(CONFIG::ASIO_OUTPUTE_ID ) ; \
  303. bool audio_has_ksinput_property = \
  304. audio.hasProperty(CONFIG::KS_INPUT_ID ) ; \
  305. bool audio_has_ksoutput_property = \
  306. audio.hasProperty(CONFIG::KS_OUTPUT_ID ) ; \
  307. bool audio_has_kssamplerate_property = \
  308. audio.hasProperty(CONFIG::KS_SAMPLERATE_ID ) ; \
  309. bool audio_has_ksbitdepth_property = \
  310. audio.hasProperty(CONFIG::KS_BITDEPTH_ID ) ; \
  311. bool audio_has_ksnblocks_property = \
  312. audio.hasProperty(CONFIG::KS_NBLOCKS_ID ) ; \
  313. bool audio_has_ksblocksize_property = \
  314. audio.hasProperty(CONFIG::KS_BLOCKSIZE_ID ) ; \
  315. bool audio_has_dsinput_property = \
  316. audio.hasProperty(CONFIG::DS_INPUT_ID ) ; \
  317. bool audio_has_dsoutput_property = \
  318. audio.hasProperty(CONFIG::DS_OUTPUT_ID ) ; \
  319. bool audio_has_dssamplerate_property = \
  320. audio.hasProperty(CONFIG::DS_SAMPLERATE_ID ) ; \
  321. bool audio_has_dsbitdepth_property = \
  322. audio.hasProperty(CONFIG::DS_BITDEPTH_ID ) ; \
  323. bool audio_has_dsnblocks_property = \
  324. audio.hasProperty(CONFIG::DS_NBLOCKS_ID ) ; \
  325. bool audio_has_dsblocksize_property = \
  326. audio.hasProperty(CONFIG::DS_BLOCKSIZE_ID ) ; \
  327. bool audio_has_waveinput_property = \
  328. audio.hasProperty(CONFIG::WAVE_INPUT_ID ) ; \
  329. bool audio_has_waveoutput_property = \
  330. audio.hasProperty(CONFIG::WAVE_OUTPUT_ID ) ; \
  331. bool audio_has_wavesamplerate_property = \
  332. audio.hasProperty(CONFIG::WAVE_SAMPLERATE_ID) ; \
  333. bool audio_has_wavebitdepth_property = \
  334. audio.hasProperty(CONFIG::WAVE_BITDEPTH_ID ) ; \
  335. bool audio_has_wavenblocks_property = \
  336. audio.hasProperty(CONFIG::WAVE_NBLOCKS_ID ) ; \
  337. bool audio_has_waveblocksize_property = \
  338. audio.hasProperty(CONFIG::WAVE_BLOCKSIZE_ID ) ; \
  339. \
  340. /* query win audio datatypes */ \
  341. bool audio_api_is_int = audio[CONFIG::AUDIO_API_ID ].isInt() ; \
  342. bool asio_driver_is_int = audio[CONFIG::ASIO_DRIVER_ID ].isInt() ; \
  343. bool asio_inputb_is_int = audio[CONFIG::ASIO_INPUTB_ID ].isInt() ; \
  344. bool asio_inoute_is_int = audio[CONFIG::ASIO_INPUTE_ID ].isInt() ; \
  345. bool asio_outputb_is_int = audio[CONFIG::ASIO_OUTPUTB_ID ].isInt() ; \
  346. bool asio_outpute_is_int = audio[CONFIG::ASIO_OUTPUTE_ID ].isInt() ; \
  347. bool ks_input_is_int = audio[CONFIG::KS_INPUT_ID ].isInt() ; \
  348. bool ks_output_is_int = audio[CONFIG::KS_OUTPUT_ID ].isInt() ; \
  349. bool ks_samplerate_is_int = audio[CONFIG::KS_SAMPLERATE_ID ].isInt() ; \
  350. bool ks_bitdepth_is_int = audio[CONFIG::KS_BITDEPTH_ID ].isInt() ; \
  351. bool ks_nblocks_is_int = audio[CONFIG::KS_NBLOCKS_ID ].isInt() ; \
  352. bool ks_blocksize_is_int = audio[CONFIG::KS_BLOCKSIZE_ID ].isInt() ; \
  353. bool ds_input_is_string = audio[CONFIG::DS_INPUT_ID ].isString() ; \
  354. bool ds_output_is_string = audio[CONFIG::DS_OUTPUT_ID ].isString() ; \
  355. bool ds_samplerate_is_int = audio[CONFIG::DS_SAMPLERATE_ID ].isInt() ; \
  356. bool ds_bitdepth_is_int = audio[CONFIG::DS_BITDEPTH_ID ].isInt() ; \
  357. bool ds_nblocks_is_int = audio[CONFIG::DS_NBLOCKS_ID ].isInt() ; \
  358. bool ds_blocksize_is_int = audio[CONFIG::DS_BLOCKSIZE_ID ].isInt() ; \
  359. bool wave_input_is_int = audio[CONFIG::WAVE_INPUT_ID ].isInt() ; \
  360. bool wave_output_is_int = audio[CONFIG::WAVE_OUTPUT_ID ].isInt() ; \
  361. bool wave_samplerate_is_int = audio[CONFIG::WAVE_SAMPLERATE_ID].isInt() ; \
  362. bool wave_bitdepth_is_int = audio[CONFIG::WAVE_BITDEPTH_ID ].isInt() ; \
  363. bool wave_nblocks_is_int = audio[CONFIG::WAVE_NBLOCKS_ID ].isInt() ; \
  364. bool wave_blocksize_is_int = audio[CONFIG::WAVE_BLOCKSIZE_ID ].isInt() ; \
  365. \
  366. /* trace missing win audio properties */ \
  367. if (!audio_has_api_property) \
  368. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::AUDIO_API_KEY ) ; \
  369. if (!audio_has_asiodriver_property) \
  370. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::ASIO_DRIVER_KEY ) ; \
  371. if (!audio_has_asioinputb_property) \
  372. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::ASIO_INPUTB_KEY ) ; \
  373. if (!audio_has_asioinpute_property) \
  374. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::ASIO_INPUTE_KEY ) ; \
  375. if (!audio_has_asiooutputb_property) \
  376. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::ASIO_OUTPUTB_KEY ) ; \
  377. if (!audio_has_asiooutpute_property) \
  378. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::ASIO_OUTPUTE_KEY ) ; \
  379. if (!audio_has_ksinput_property) \
  380. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::KS_INPUT_KEY ) ; \
  381. if (!audio_has_ksoutput_property) \
  382. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::KS_OUTPUT_KEY ) ; \
  383. if (!audio_has_kssamplerate_property) \
  384. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::KS_SAMPLERATE_KEY ) ; \
  385. if (!audio_has_ksbitdepth_property) \
  386. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::KS_BITDEPTH_KEY ) ; \
  387. if (!audio_has_ksnblocks_property) \
  388. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::KS_NBLOCKS_KEY ) ; \
  389. if (!audio_has_ksblocksize_property) \
  390. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::KS_BLOCKSIZE_KEY ) ; \
  391. if (!audio_has_dsinput_property) \
  392. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::DS_INPUT_KEY ) ; \
  393. if (!audio_has_dsoutput_property) \
  394. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::DS_OUTPUT_KEY ) ; \
  395. if (!audio_has_dssamplerate_property) \
  396. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::DS_SAMPLERATE_KEY ) ; \
  397. if (!audio_has_dsbitdepth_property) \
  398. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::DS_BITDEPTH_KEY ) ; \
  399. if (!audio_has_dsnblocks_property) \
  400. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::DS_NBLOCKS_KEY ) ; \
  401. if (!audio_has_dsblocksize_property) \
  402. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::DS_BLOCKSIZE_KEY ) ; \
  403. if (!audio_has_waveinput_property) \
  404. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::WAVE_INPUT_KEY ) ; \
  405. if (!audio_has_waveoutput_property) \
  406. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::WAVE_OUTPUT_KEY ) ; \
  407. if (!audio_has_wavesamplerate_property) \
  408. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::WAVE_SAMPLERATE_KEY) ; \
  409. if (!audio_has_wavebitdepth_property) \
  410. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::WAVE_BITDEPTH_KEY ) ; \
  411. if (!audio_has_wavenblocks_property) \
  412. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::WAVE_NBLOCKS_KEY ) ; \
  413. if (!audio_has_waveblocksize_property) \
  414. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::WAVE_BLOCKSIZE_KEY ) ; \
  415. \
  416. /* trace invalid win audio datatypes */ \
  417. if (!audio_api_is_int) \
  418. Trace::TraceTypeMismatch(audio , CONFIG::AUDIO_API_KEY , \
  419. CONFIG::INT_TYPE , audio[CONFIG::AUDIO_API_ID ] ) ; \
  420. if (!asio_driver_is_int) \
  421. Trace::TraceTypeMismatch(audio , CONFIG::ASIO_DRIVER_KEY , \
  422. CONFIG::INT_TYPE , audio[CONFIG::ASIO_DRIVER_ID ] ) ; \
  423. if (!asio_inputb_is_int) \
  424. Trace::TraceTypeMismatch(audio , CONFIG::ASIO_INPUTB_KEY , \
  425. CONFIG::INT_TYPE , audio[CONFIG::ASIO_INPUTB_ID ] ) ; \
  426. if (!asio_inoute_is_int) \
  427. Trace::TraceTypeMismatch(audio , CONFIG::ASIO_INPUTE_KEY , \
  428. CONFIG::INT_TYPE , audio[CONFIG::ASIO_INPUTE_ID ] ) ; \
  429. if (!asio_outputb_is_int) \
  430. Trace::TraceTypeMismatch(audio , CONFIG::ASIO_OUTPUTB_KEY , \
  431. CONFIG::INT_TYPE , audio[CONFIG::ASIO_OUTPUTB_ID ] ) ; \
  432. if (!asio_outpute_is_int) \
  433. Trace::TraceTypeMismatch(audio , CONFIG::ASIO_OUTPUTE_KEY , \
  434. CONFIG::INT_TYPE , audio[CONFIG::ASIO_OUTPUTE_ID ] ) ; \
  435. if (!ks_input_is_int) \
  436. Trace::TraceTypeMismatch(audio , CONFIG::KS_INPUT_KEY , \
  437. CONFIG::INT_TYPE , audio[CONFIG::KS_INPUT_ID ] ) ; \
  438. if (!ks_output_is_int) \
  439. Trace::TraceTypeMismatch(audio , CONFIG::KS_OUTPUT_KEY , \
  440. CONFIG::INT_TYPE , audio[CONFIG::KS_OUTPUT_ID ] ) ; \
  441. if (!ks_samplerate_is_int) \
  442. Trace::TraceTypeMismatch(audio , CONFIG::KS_SAMPLERATE_KEY , \
  443. CONFIG::INT_TYPE , audio[CONFIG::KS_SAMPLERATE_ID ] ) ; \
  444. if (!ks_bitdepth_is_int) \
  445. Trace::TraceTypeMismatch(audio , CONFIG::KS_BITDEPTH_KEY , \
  446. CONFIG::INT_TYPE , audio[CONFIG::KS_BITDEPTH_ID ] ) ; \
  447. if (!ks_nblocks_is_int) \
  448. Trace::TraceTypeMismatch(audio , CONFIG::KS_NBLOCKS_KEY , \
  449. CONFIG::INT_TYPE , audio[CONFIG::KS_NBLOCKS_ID ] ) ; \
  450. if (!ks_blocksize_is_int) \
  451. Trace::TraceTypeMismatch(audio , CONFIG::KS_BLOCKSIZE_KEY , \
  452. CONFIG::INT_TYPE , audio[CONFIG::KS_BLOCKSIZE_ID ] ) ; \
  453. if (!ds_input_is_string) \
  454. Trace::TraceTypeMismatch(audio , CONFIG::DS_INPUT_KEY , \
  455. CONFIG::STRING_TYPE , audio[CONFIG::DS_INPUT_ID ] ) ; \
  456. if (!ds_output_is_string) \
  457. Trace::TraceTypeMismatch(audio , CONFIG::DS_OUTPUT_KEY , \
  458. CONFIG::STRING_TYPE , audio[CONFIG::DS_OUTPUT_ID ] ) ; \
  459. if (!ds_samplerate_is_int) \
  460. Trace::TraceTypeMismatch(audio , CONFIG::DS_SAMPLERATE_KEY , \
  461. CONFIG::INT_TYPE , audio[CONFIG::DS_SAMPLERATE_ID ] ) ; \
  462. if (!ds_bitdepth_is_int) \
  463. Trace::TraceTypeMismatch(audio , CONFIG::DS_BITDEPTH_KEY , \
  464. CONFIG::INT_TYPE , audio[CONFIG::DS_BITDEPTH_ID ] ) ; \
  465. if (!ds_nblocks_is_int) \
  466. Trace::TraceTypeMismatch(audio , CONFIG::DS_NBLOCKS_KEY , \
  467. CONFIG::INT_TYPE , audio[CONFIG::DS_NBLOCKS_ID ] ) ; \
  468. if (!ds_blocksize_is_int) \
  469. Trace::TraceTypeMismatch(audio , CONFIG::DS_BLOCKSIZE_KEY , \
  470. CONFIG::INT_TYPE , audio[CONFIG::DS_BLOCKSIZE_ID ] ) ; \
  471. if (!wave_input_is_int) \
  472. Trace::TraceTypeMismatch(audio , CONFIG::WAVE_INPUT_KEY , \
  473. CONFIG::INT_TYPE , audio[CONFIG::WAVE_INPUT_ID ] ) ; \
  474. if (!wave_output_is_int) \
  475. Trace::TraceTypeMismatch(audio , CONFIG::WAVE_OUTPUT_KEY , \
  476. CONFIG::INT_TYPE , audio[CONFIG::WAVE_OUTPUT_ID ] ) ; \
  477. if (!wave_samplerate_is_int) \
  478. Trace::TraceTypeMismatch(audio , CONFIG::WAVE_SAMPLERATE_KEY , \
  479. CONFIG::INT_TYPE , audio[CONFIG::WAVE_SAMPLERATE_ID] ) ; \
  480. if (!wave_bitdepth_is_int) \
  481. Trace::TraceTypeMismatch(audio , CONFIG::WAVE_BITDEPTH_KEY , \
  482. CONFIG::INT_TYPE , audio[CONFIG::WAVE_BITDEPTH_ID ] ) ; \
  483. if (!wave_nblocks_is_int) \
  484. Trace::TraceTypeMismatch(audio , CONFIG::WAVE_NBLOCKS_KEY , \
  485. CONFIG::INT_TYPE , audio[CONFIG::WAVE_NBLOCKS_ID ] ) ; \
  486. if (!wave_blocksize_is_int) \
  487. Trace::TraceTypeMismatch(audio , CONFIG::WAVE_BLOCKSIZE_KEY , \
  488. CONFIG::INT_TYPE , audio[CONFIG::WAVE_BLOCKSIZE_ID ] ) ; \
  489. \
  490. /* modify return value */ \
  491. is_valid = is_valid && \
  492. audio_has_api_property && audio_api_is_int && \
  493. audio_has_asiodriver_property && asio_driver_is_int && \
  494. audio_has_asioinputb_property && asio_inputb_is_int && \
  495. audio_has_asioinpute_property && asio_inoute_is_int && \
  496. audio_has_asiooutputb_property && asio_outputb_is_int && \
  497. audio_has_asiooutpute_property && asio_outpute_is_int && \
  498. audio_has_ksinput_property && ks_input_is_int && \
  499. audio_has_ksoutput_property && ks_output_is_int && \
  500. audio_has_kssamplerate_property && ks_samplerate_is_int && \
  501. audio_has_ksbitdepth_property && ks_bitdepth_is_int && \
  502. audio_has_ksnblocks_property && ks_nblocks_is_int && \
  503. audio_has_ksblocksize_property && ks_blocksize_is_int && \
  504. audio_has_dsinput_property && ds_input_is_string && \
  505. audio_has_dsoutput_property && ds_output_is_string && \
  506. audio_has_dssamplerate_property && ds_samplerate_is_int && \
  507. audio_has_dsbitdepth_property && ds_bitdepth_is_int && \
  508. audio_has_dsnblocks_property && ds_nblocks_is_int && \
  509. audio_has_dsblocksize_property && ds_blocksize_is_int && \
  510. audio_has_waveinput_property && wave_input_is_int && \
  511. audio_has_waveoutput_property && wave_output_is_int && \
  512. audio_has_wavesamplerate_property && wave_samplerate_is_int && \
  513. audio_has_wavebitdepth_property && wave_bitdepth_is_int && \
  514. audio_has_wavenblocks_property && wave_nblocks_is_int && \
  515. audio_has_waveblocksize_property && wave_blocksize_is_int ;
  516. #define DEBUG_VALIDATE_CONFIG_AUDIO_MAC \
  517. /* query mac audio properties */ \
  518. bool audio_has_api_property = audio.hasProperty(CONFIG::AUDIO_API_ID ) ; \
  519. bool audio_has_cainput_property = audio.hasProperty(CONFIG::CA_INPUT_ID ) ; \
  520. bool audio_has_caoutput_property = audio.hasProperty(CONFIG::CA_OUTPUT_ID ) ; \
  521. bool audio_has_canchannels_property = audio.hasProperty(CONFIG::CA_NCHANNELS_ID ) ; \
  522. bool audio_has_casamplerate_property = audio.hasProperty(CONFIG::CA_SAMPLERATE_ID) ; \
  523. bool audio_has_cabitdepth_property = audio.hasProperty(CONFIG::CA_BITDEPTH_ID ) ; \
  524. \
  525. /* query mac audio datatypes */ \
  526. bool audio_api_is_int = audio[CONFIG::AUDIO_API_ID ].isInt() ; \
  527. bool ca_input_is_string = audio[CONFIG::CA_INPUT_ID ].isString() ; \
  528. bool ca_output_is_string = audio[CONFIG::CA_OUTPUT_ID ].isString() ; \
  529. bool ca_nchannels_is_int = audio[CONFIG::CA_NCHANNELS_ID ].isInt() ; \
  530. bool ca_samplerate_is_int = audio[CONFIG::CA_SAMPLERATE_ID].isInt() ; \
  531. bool ca_bitdepth_is_int = audio[CONFIG::CA_BITDEPTH_ID ].isInt() ; \
  532. \
  533. /* trace missing mac audio properties */ \
  534. if (!audio_has_api_property) \
  535. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::AUDIO_API_KEY ) ; \
  536. if (!audio_has_cainput_property) \
  537. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::CA_INPUT_KEY ) ; \
  538. if (!audio_has_caoutput_property) \
  539. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::CA_OUTPUT_KEY ) ; \
  540. if (!audio_has_canchannels_property) \
  541. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::CA_NCHANNELS_KEY ) ; \
  542. if (!audio_has_casamplerate_property) \
  543. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::CA_SAMPLERATE_KEY) ; \
  544. if (!audio_has_cabitdepth_property) \
  545. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::CA_BITDEPTH_KEY ) ; \
  546. \
  547. /* trace invalid mac audio datatypes */ \
  548. if (!audio_api_is_int) \
  549. Trace::TraceTypeMismatch(audio , CONFIG::AUDIO_API_KEY , \
  550. CONFIG::INT_TYPE , audio[CONFIG::AUDIO_API_ID ] ) ; \
  551. if (!ca_input_is_string) \
  552. Trace::TraceTypeMismatch(audio , CONFIG::CA_INPUT_KEY , \
  553. CONFIG::STRING_TYPE , audio[CONFIG::CA_INPUT_ID ] ) ; \
  554. if (!ca_output_is_string) \
  555. Trace::TraceTypeMismatch(audio , CONFIG::CA_OUTPUT_KEY , \
  556. CONFIG::STRING_TYPE , audio[CONFIG::CA_OUTPUT_ID ] ) ; \
  557. if (!ca_nchannels_is_int) \
  558. Trace::TraceTypeMismatch(audio , CONFIG::CA_NCHANNELS_KEY , \
  559. CONFIG::INT_TYPE , audio[CONFIG::CA_NCHANNELS_ID ] ) ; \
  560. if (!ca_samplerate_is_int) \
  561. Trace::TraceTypeMismatch(audio , CONFIG::CA_SAMPLERATE_KEY , \
  562. CONFIG::INT_TYPE , audio[CONFIG::CA_SAMPLERATE_ID] ) ; \
  563. if (!ca_bitdepth_is_int) \
  564. Trace::TraceTypeMismatch(audio , CONFIG::CA_BITDEPTH_KEY , \
  565. CONFIG::INT_TYPE , audio[CONFIG::CA_BITDEPTH_ID ] ) ; \
  566. \
  567. /* modify return value */ \
  568. is_valid = is_valid && \
  569. audio_has_api_property && audio_api_is_int && \
  570. audio_has_cainput_property && ca_input_is_string && \
  571. audio_has_caoutput_property && ca_output_is_string && \
  572. audio_has_canchannels_property && ca_nchannels_is_int && \
  573. audio_has_casamplerate_property && ca_samplerate_is_int && \
  574. audio_has_cabitdepth_property && ca_bitdepth_is_int ;
  575. #define DEBUG_VALIDATE_CONFIG_AUDIO_NIX \
  576. /* query nix audio properties */ \
  577. bool audio_has_api_property = \
  578. audio.hasProperty(CONFIG::AUDIO_API_ID ) ; \
  579. bool audio_has_jackserver_property = \
  580. audio.hasProperty(CONFIG::JACK_SERVER_ID ) ; \
  581. bool audio_has_jackname_property = \
  582. audio.hasProperty(CONFIG::JACK_NAME_ID ) ; \
  583. bool audio_has_jackninputs_property = \
  584. audio.hasProperty(CONFIG::JACK_NINPUTS_ID ) ; \
  585. bool audio_has_jacknoutputs_property = \
  586. audio.hasProperty(CONFIG::JACK_NOUTPUTS_ID ) ; \
  587. bool audio_has_alsainput_property = \
  588. audio.hasProperty(CONFIG::ALSA_INPUT_ID ) ; \
  589. bool audio_has_alsaoutput_property = \
  590. audio.hasProperty(CONFIG::ALSA_OUTPUT_ID ) ; \
  591. bool audio_has_alsanchannels_property = \
  592. audio.hasProperty(CONFIG::ALSA_NCHANNELS_ID ) ; \
  593. bool audio_has_alsasamplerate_property = \
  594. audio.hasProperty(CONFIG::ALSA_SAMPLERATE_ID) ; \
  595. bool audio_has_alsabitdepth_property = \
  596. audio.hasProperty(CONFIG::ALSA_BITDEPTH_ID ) ; \
  597. bool audio_has_alsanblocks_property = \
  598. audio.hasProperty(CONFIG::ALSA_NBLOCKS_ID ) ; \
  599. bool audio_has_alsablocksize_property = \
  600. audio.hasProperty(CONFIG::ALSA_BLOCKSIZE_ID ) ; \
  601. \
  602. /* query nix audio datatypes */ \
  603. bool audio_api_is_int = audio[CONFIG::AUDIO_API_ID ].isInt() ; \
  604. bool jack_server_is_int = audio[CONFIG::JACK_SERVER_ID ].isInt() ; \
  605. bool jack_name_is_string = audio[CONFIG::JACK_NAME_ID ].isString() ; \
  606. bool jack_ninputs_is_int = audio[CONFIG::JACK_NINPUTS_ID ].isInt() ; \
  607. bool jack_noutputs_is_int = audio[CONFIG::JACK_NOUTPUTS_ID ].isInt() ; \
  608. bool alsa_input_is_string = audio[CONFIG::ALSA_INPUT_ID ].isString() ; \
  609. bool alsa_output_is_string = audio[CONFIG::ALSA_OUTPUT_ID ].isString() ; \
  610. bool alsa_nchannels_is_int = audio[CONFIG::ALSA_NCHANNELS_ID ].isInt() ; \
  611. bool alsa_samplerate_is_int = audio[CONFIG::ALSA_SAMPLERATE_ID].isInt() ; \
  612. bool alsa_bitdepth_is_int = audio[CONFIG::ALSA_BITDEPTH_ID ].isInt() ; \
  613. bool alsa_nblocks_is_int = audio[CONFIG::ALSA_NBLOCKS_ID ].isInt() ; \
  614. bool alsa_blocksize_is_int = audio[CONFIG::ALSA_BLOCKSIZE_ID ].isInt() ; \
  615. \
  616. /* trace missing nix audio properties */ \
  617. if (!audio_has_api_property) \
  618. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::AUDIO_API_KEY ) ; \
  619. if (!audio_has_jackserver_property) \
  620. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::JACK_SERVER_KEY ) ; \
  621. if (!audio_has_jackname_property) \
  622. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::JACK_NAME_KEY ) ; \
  623. if (!audio_has_jackninputs_property) \
  624. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::JACK_NINPUTS_KEY ) ; \
  625. if (!audio_has_jacknoutputs_property) \
  626. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::JACK_NOUTPUTS_KEY ) ; \
  627. if (!audio_has_alsainput_property) \
  628. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::ALSA_INPUT_KEY ) ; \
  629. if (!audio_has_alsaoutput_property) \
  630. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::ALSA_OUTPUT_KEY ) ; \
  631. if (!audio_has_alsanchannels_property) \
  632. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::ALSA_NCHANNELS_KEY ) ; \
  633. if (!audio_has_alsasamplerate_property) \
  634. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::ALSA_SAMPLERATE_KEY) ; \
  635. if (!audio_has_alsabitdepth_property) \
  636. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::ALSA_BITDEPTH_KEY ) ; \
  637. if (!audio_has_alsanblocks_property) \
  638. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::ALSA_NBLOCKS_KEY ) ; \
  639. if (!audio_has_alsablocksize_property) \
  640. Trace::TraceMissingProperty(CONFIG::AUDIO_KEY , CONFIG::ALSA_BLOCKSIZE_KEY ) ; \
  641. \
  642. /* trace invalid nix audio datatypes */ \
  643. if (!audio_api_is_int) \
  644. Trace::TraceTypeMismatch(audio , CONFIG::AUDIO_API_KEY , \
  645. CONFIG::INT_TYPE , audio[CONFIG::AUDIO_API_ID ] ) ; \
  646. if (!jack_server_is_int) \
  647. Trace::TraceTypeMismatch(audio , CONFIG::JACK_SERVER_KEY , \
  648. CONFIG::INT_TYPE , audio[CONFIG::JACK_SERVER_ID ] ) ; \
  649. if (!jack_name_is_string) \
  650. Trace::TraceTypeMismatch(audio , CONFIG::JACK_NAME_KEY , \
  651. CONFIG::STRING_TYPE , audio[CONFIG::JACK_NAME_ID ] ) ; \
  652. if (!jack_ninputs_is_int) \
  653. Trace::TraceTypeMismatch(audio , CONFIG::JACK_NINPUTS_KEY , \
  654. CONFIG::INT_TYPE , audio[CONFIG::JACK_NINPUTS_ID ] ) ; \
  655. if (!jack_noutputs_is_int) \
  656. Trace::TraceTypeMismatch(audio , CONFIG::JACK_NOUTPUTS_KEY , \
  657. CONFIG::INT_TYPE , audio[CONFIG::JACK_NOUTPUTS_ID ] ) ; \
  658. if (!alsa_input_is_string) \
  659. Trace::TraceTypeMismatch(audio , CONFIG::ALSA_INPUT_KEY , \
  660. CONFIG::STRING_TYPE , audio[CONFIG::ALSA_INPUT_ID ] ) ; \
  661. if (!alsa_output_is_string) \
  662. Trace::TraceTypeMismatch(audio , CONFIG::ALSA_OUTPUT_KEY , \
  663. CONFIG::STRING_TYPE , audio[CONFIG::ALSA_OUTPUT_ID ] ) ; \
  664. if (!alsa_nchannels_is_int) \
  665. Trace::TraceTypeMismatch(audio , CONFIG::ALSA_NCHANNELS_KEY , \
  666. CONFIG::INT_TYPE , audio[CONFIG::ALSA_NCHANNELS_ID ] ) ; \
  667. if (!alsa_samplerate_is_int) \
  668. Trace::TraceTypeMismatch(audio , CONFIG::ALSA_SAMPLERATE_KEY , \
  669. CONFIG::INT_TYPE , audio[CONFIG::ALSA_SAMPLERATE_ID] ) ; \
  670. if (!alsa_bitdepth_is_int) \
  671. Trace::TraceTypeMismatch(audio , CONFIG::ALSA_BITDEPTH_KEY , \
  672. CONFIG::INT_TYPE , audio[CONFIG::ALSA_BITDEPTH_ID ] ) ; \
  673. if (!alsa_nblocks_is_int) \
  674. Trace::TraceTypeMismatch(audio , CONFIG::ALSA_NBLOCKS_KEY , \
  675. CONFIG::INT_TYPE , audio[CONFIG::ALSA_NBLOCKS_ID ] ) ; \
  676. if (!alsa_blocksize_is_int) \
  677. Trace::TraceTypeMismatch(audio , CONFIG::ALSA_BLOCKSIZE_KEY , \
  678. CONFIG::INT_TYPE , audio[CONFIG::ALSA_BLOCKSIZE_ID ] ) ; \
  679. \
  680. /* modify return value */ \
  681. is_valid = is_valid && \
  682. audio_has_api_property && audio_api_is_int && \
  683. audio_has_jackserver_property && jack_server_is_int && \
  684. audio_has_jackname_property && jack_name_is_string && \
  685. audio_has_jackninputs_property && jack_ninputs_is_int && \
  686. audio_has_jacknoutputs_property && jack_noutputs_is_int && \
  687. audio_has_alsainput_property && alsa_input_is_string && \
  688. audio_has_alsaoutput_property && alsa_output_is_string && \
  689. audio_has_alsanchannels_property && alsa_nchannels_is_int && \
  690. audio_has_alsasamplerate_property && alsa_samplerate_is_int && \
  691. audio_has_alsabitdepth_property && alsa_bitdepth_is_int && \
  692. audio_has_alsanblocks_property && alsa_nblocks_is_int && \
  693. audio_has_alsablocksize_property && alsa_blocksize_is_int ;
  694. #ifdef _WIN32
  695. # define DEBUG_VALIDATE_CONFIG_AUDIO DEBUG_VALIDATE_CONFIG_AUDIO_WIN
  696. #else // _WIN32
  697. # ifdef _MAC
  698. # define DEBUG_VALIDATE_CONFIG_AUDIO DEBUG_VALIDATE_CONFIG_AUDIO_MAC
  699. # else // _MAC
  700. # define DEBUG_VALIDATE_CONFIG_AUDIO DEBUG_VALIDATE_CONFIG_AUDIO_NIX
  701. # endif // _MAC
  702. #endif // _WIN32
  703. #define DEBUG_VALIDATE_CONFIG_SERVER \
  704. /* query server properties */ \
  705. bool server_has_host_property = server.hasProperty(CONFIG::HOST_ID ) ; \
  706. bool server_has_login_property = server.hasProperty(CONFIG::LOGIN_ID ) ; \
  707. bool server_has_pass_property = server.hasProperty(CONFIG::PASS_ID ) ; \
  708. bool server_has_is_anonymous_property = server.hasProperty(CONFIG::IS_ANONYMOUS_ID) ; \
  709. bool server_has_is_agreed_property = server.hasProperty(CONFIG::IS_AGREED_ID ) ; \
  710. bool server_has_should_agree_property = server.hasProperty(CONFIG::SHOULD_AGREE_ID) ; \
  711. bool server_has_bot_name_property = server.hasProperty(CONFIG::BOT_NAME_ID ) ; \
  712. bool server_has_bot_useridx_property = server.hasProperty(CONFIG::BOT_USERIDX_ID ) ; \
  713. \
  714. /* query server datatypes */ \
  715. bool host_name_is_string = server[CONFIG::HOST_ID ].isString() ; \
  716. bool login_is_string = server[CONFIG::LOGIN_ID ].isString() ; \
  717. bool pass_is_string = server[CONFIG::PASS_ID ].isString() ; \
  718. bool is_anon_is_bool = server[CONFIG::IS_ANONYMOUS_ID].isBool() ; \
  719. bool is_agreed_is_bool = server[CONFIG::IS_AGREED_ID ].isBool() ; \
  720. bool should_agree_is_bool = server[CONFIG::SHOULD_AGREE_ID].isBool() ; \
  721. bool bot_name_is_string = server[CONFIG::BOT_NAME_ID ].isString() ; \
  722. bool bot_useridx_is_int = server[CONFIG::BOT_USERIDX_ID ].isInt() ; \
  723. \
  724. /* trace missing server properties */ \
  725. if (!server_has_host_property) \
  726. Trace::TraceMissingValue(CONFIG::SERVER_KEY , CONFIG::HOST_KEY ) ; \
  727. if (!server_has_login_property) \
  728. Trace::TraceMissingValue(CONFIG::SERVER_KEY , CONFIG::LOGIN_KEY ) ; \
  729. if (!server_has_pass_property) \
  730. Trace::TraceMissingValue(CONFIG::SERVER_KEY , CONFIG::PASS_KEY ) ; \
  731. if (!server_has_is_anonymous_property) \
  732. Trace::TraceMissingValue(CONFIG::SERVER_KEY , CONFIG::IS_ANONYMOUS_KEY) ; \
  733. if (!server_has_is_agreed_property) \
  734. Trace::TraceMissingValue(CONFIG::SERVER_KEY , CONFIG::IS_AGREED_KEY ) ; \
  735. if (!server_has_should_agree_property) \
  736. Trace::TraceMissingValue(CONFIG::SERVER_KEY , CONFIG::SHOULD_AGREE_KEY) ; \
  737. if (!server_has_bot_name_property) \
  738. Trace::TraceMissingValue(CONFIG::SERVER_KEY , CONFIG::BOT_NAME_KEY ) ; \
  739. if (!server_has_bot_useridx_property) \
  740. Trace::TraceMissingValue(CONFIG::SERVER_KEY , CONFIG::BOT_USERIDX_KEY ) ; \
  741. \
  742. /* trace invalid server datatypes */ \
  743. if (!host_name_is_string) \
  744. Trace::TraceTypeMismatch(server , CONFIG::HOST_KEY , \
  745. CONFIG::STRING_TYPE , server[CONFIG::HOST_ID ] ) ; \
  746. if (!login_is_string) \
  747. Trace::TraceTypeMismatch(server , CONFIG::LOGIN_KEY , \
  748. CONFIG::STRING_TYPE , server[CONFIG::LOGIN_ID ] ) ; \
  749. if (!pass_is_string) \
  750. Trace::TraceTypeMismatch(server , CONFIG::PASS_KEY , \
  751. CONFIG::STRING_TYPE , server[CONFIG::PASS_ID ] ) ; \
  752. if (!is_anon_is_bool) \
  753. Trace::TraceTypeMismatch(server , CONFIG::IS_ANONYMOUS_KEY , \
  754. CONFIG::BOOL_TYPE , server[CONFIG::IS_ANONYMOUS_ID] ) ; \
  755. if (!is_agreed_is_bool) \
  756. Trace::TraceTypeMismatch(server , CONFIG::IS_AGREED_KEY , \
  757. CONFIG::BOOL_TYPE , server[CONFIG::IS_AGREED_ID ] ) ; \
  758. if (!should_agree_is_bool) \
  759. Trace::TraceTypeMismatch(server , CONFIG::SHOULD_AGREE_KEY , \
  760. CONFIG::BOOL_TYPE , server[CONFIG::SHOULD_AGREE_ID] ) ; \
  761. if (!bot_name_is_string) \
  762. Trace::TraceTypeMismatch(server , CONFIG::BOT_NAME_KEY , \
  763. CONFIG::STRING_TYPE , server[CONFIG::BOT_NAME_ID ] ) ; \
  764. if (!bot_useridx_is_int) \
  765. Trace::TraceTypeMismatch(server , CONFIG::BOT_USERIDX_KEY , \
  766. CONFIG::INT_TYPE , server[CONFIG::BOT_USERIDX_ID ] ) ; \
  767. \
  768. /* modify return value */ \
  769. is_valid = is_valid && \
  770. server_has_host_property && host_name_is_string && \
  771. server_has_login_property && login_is_string && \
  772. server_has_pass_property && pass_is_string && \
  773. server_has_is_anonymous_property && is_anon_is_bool && \
  774. server_has_is_agreed_property && is_agreed_is_bool && \
  775. server_has_should_agree_property && should_agree_is_bool && \
  776. server_has_bot_name_property && bot_name_is_string && \
  777. server_has_bot_useridx_property && bot_useridx_is_int ;
  778. #define DEBUG_VALIDATE_CONFIG_MASTERS \
  779. /* query masters properties */ \
  780. bool master_channel_has_name_property = master.hasProperty(CONFIG::CHANNEL_NAME_ID) ; \
  781. bool master_channel_has_volume_property = master.hasProperty(CONFIG::VOLUME_ID ) ; \
  782. bool master_channel_has_pan_property = master.hasProperty(CONFIG::PAN_ID ) ; \
  783. bool master_channel_has_mute_property = master.hasProperty(CONFIG::IS_MUTED_ID ) ; \
  784. bool master_channel_has_stereo_property = master.hasProperty(CONFIG::STEREO_ID ) ; \
  785. bool master_channel_has_vuleft_property = master.hasProperty(CONFIG::VU_LEFT_ID ) ; \
  786. bool master_channel_has_vuright_property = master.hasProperty(CONFIG::VU_RIGHT_ID ) ; \
  787. bool metro_channel_has_name_property = metro .hasProperty(CONFIG::CHANNEL_NAME_ID) ; \
  788. bool metro_channel_has_volume_property = metro .hasProperty(CONFIG::VOLUME_ID ) ; \
  789. bool metro_channel_has_pan_property = metro .hasProperty(CONFIG::PAN_ID ) ; \
  790. bool metro_channel_has_mute_property = metro .hasProperty(CONFIG::IS_MUTED_ID ) ; \
  791. bool metro_channel_has_source_property = metro .hasProperty(CONFIG::SOURCE_N_ID ) ; \
  792. bool metro_channel_has_stereo_property = metro .hasProperty(CONFIG::STEREO_ID ) ; \
  793. bool metro_channel_has_vuleft_property = metro .hasProperty(CONFIG::VU_LEFT_ID ) ; \
  794. bool metro_channel_has_vuright_property = metro .hasProperty(CONFIG::VU_RIGHT_ID ) ; \
  795. \
  796. /* query masters datatypes */ \
  797. bool master_name_is_string = master[CONFIG::CHANNEL_NAME_ID].isString() ; \
  798. bool master_volume_is_double = master[CONFIG::VOLUME_ID ].isDouble() ; \
  799. bool master_pan_is_double = master[CONFIG::PAN_ID ].isDouble() ; \
  800. bool master_mute_is_bool = master[CONFIG::IS_MUTED_ID ].isBool() ; \
  801. bool master_stereo_is_int = master[CONFIG::STEREO_ID ].isInt() ; \
  802. bool master_vuleft_is_double = master[CONFIG::VU_LEFT_ID ].isDouble() ; \
  803. bool master_vuright_is_double = master[CONFIG::VU_RIGHT_ID ].isDouble() ; \
  804. bool metro_name_is_string = metro [CONFIG::CHANNEL_NAME_ID].isString() ; \
  805. bool metro_volume_is_double = metro [CONFIG::VOLUME_ID ].isDouble() ; \
  806. bool metro_pan_is_double = metro [CONFIG::PAN_ID ].isDouble() ; \
  807. bool metro_mute_is_bool = metro [CONFIG::IS_MUTED_ID ].isBool() ; \
  808. bool metro_source_is_int = metro [CONFIG::SOURCE_N_ID ].isInt() ; \
  809. bool metro_stereo_is_int = metro [CONFIG::STEREO_ID ].isInt() ; \
  810. bool metro_vuleft_is_double = metro [CONFIG::VU_LEFT_ID ].isDouble() ; \
  811. bool metro_vuright_is_double = metro [CONFIG::VU_RIGHT_ID ].isDouble() ; \
  812. \
  813. /* trace missing masters properties */ \
  814. if (!master_channel_has_name_property) \
  815. Trace::TraceMissingProperty(CONFIG::MASTER_KEY , CONFIG::CHANNEL_NAME_KEY) ; \
  816. if (!master_channel_has_volume_property) \
  817. Trace::TraceMissingProperty(CONFIG::MASTER_KEY , CONFIG::VOLUME_KEY ) ; \
  818. if (!master_channel_has_pan_property) \
  819. Trace::TraceMissingProperty(CONFIG::MASTER_KEY , CONFIG::PAN_KEY ) ; \
  820. if (!master_channel_has_mute_property) \
  821. Trace::TraceMissingProperty(CONFIG::MASTER_KEY , CONFIG::IS_MUTED_KEY ) ; \
  822. if (!master_channel_has_stereo_property) \
  823. Trace::TraceMissingProperty(CONFIG::MASTER_KEY , CONFIG::STEREO_KEY ) ; \
  824. if (!master_channel_has_vuleft_property) \
  825. Trace::TraceMissingProperty(CONFIG::MASTER_KEY , CONFIG::VU_LEFT_KEY ) ; \
  826. if (!master_channel_has_vuright_property) \
  827. Trace::TraceMissingProperty(CONFIG::MASTER_KEY , CONFIG::VU_RIGHT_KEY ) ; \
  828. if (!metro_channel_has_name_property) \
  829. Trace::TraceMissingProperty(CONFIG::METRO_KEY , CONFIG::CHANNEL_NAME_KEY) ; \
  830. if (!metro_channel_has_volume_property) \
  831. Trace::TraceMissingProperty(CONFIG::METRO_KEY , CONFIG::VOLUME_KEY ) ; \
  832. if (!metro_channel_has_pan_property) \
  833. Trace::TraceMissingProperty(CONFIG::METRO_KEY , CONFIG::PAN_KEY ) ; \
  834. if (!metro_channel_has_mute_property) \
  835. Trace::TraceMissingProperty(CONFIG::METRO_KEY , CONFIG::IS_MUTED_KEY ) ; \
  836. if (!metro_channel_has_source_property) \
  837. Trace::TraceMissingProperty(CONFIG::METRO_KEY , CONFIG::SOURCE_N_KEY ) ; \
  838. if (!metro_channel_has_stereo_property) \
  839. Trace::TraceMissingProperty(CONFIG::METRO_KEY , CONFIG::STEREO_KEY ) ; \
  840. if (!metro_channel_has_vuleft_property) \
  841. Trace::TraceMissingProperty(CONFIG::METRO_KEY , CONFIG::VU_LEFT_KEY ) ; \
  842. if (!metro_channel_has_vuright_property) \
  843. Trace::TraceMissingProperty(CONFIG::METRO_KEY , CONFIG::VU_RIGHT_KEY ) ; \
  844. \
  845. /* trace invalid masters datatypes */ \
  846. if (!master_name_is_string) \
  847. Trace::TraceTypeMismatch(master , CONFIG::CHANNEL_NAME_KEY , \
  848. CONFIG::STRING_TYPE , master[CONFIG::CHANNEL_NAME_ID] ) ; \
  849. if (!master_volume_is_double) \
  850. Trace::TraceTypeMismatch(master , CONFIG::VOLUME_KEY , \
  851. CONFIG::DOUBLE_TYPE , master[CONFIG::VOLUME_ID ] ) ; \
  852. if (!master_pan_is_double) \
  853. Trace::TraceTypeMismatch(master , CONFIG::PAN_KEY , \
  854. CONFIG::DOUBLE_TYPE , master[CONFIG::PAN_ID ] ) ; \
  855. if (!master_mute_is_bool) \
  856. Trace::TraceTypeMismatch(master , CONFIG::IS_MUTED_KEY , \
  857. CONFIG::BOOL_TYPE , master[CONFIG::IS_MUTED_ID ] ) ; \
  858. if (!master_stereo_is_int) \
  859. Trace::TraceTypeMismatch(master , CONFIG::STEREO_KEY , \
  860. CONFIG::INT_TYPE , master[CONFIG::STEREO_ID ] ) ; \
  861. if (!master_vuleft_is_double) \
  862. Trace::TraceTypeMismatch(master , CONFIG::VU_LEFT_KEY , \
  863. CONFIG::DOUBLE_TYPE , master[CONFIG::VU_LEFT_ID ] ) ; \
  864. if (!master_vuright_is_double) \
  865. Trace::TraceTypeMismatch(master , CONFIG::VU_RIGHT_KEY , \
  866. CONFIG::DOUBLE_TYPE , master[CONFIG::VU_RIGHT_ID ] ) ; \
  867. if (!metro_name_is_string) \
  868. Trace::TraceTypeMismatch(metro , CONFIG::CHANNEL_NAME_KEY , \
  869. CONFIG::STRING_TYPE , metro [CONFIG::CHANNEL_NAME_ID] ) ; \
  870. if (!metro_volume_is_double) \
  871. Trace::TraceTypeMismatch(metro , CONFIG::VOLUME_KEY , \
  872. CONFIG::DOUBLE_TYPE , metro [CONFIG::VOLUME_ID ] ) ; \
  873. if (!metro_pan_is_double) \
  874. Trace::TraceTypeMismatch(metro , CONFIG::PAN_KEY , \
  875. CONFIG::DOUBLE_TYPE , metro [CONFIG::PAN_ID ] ) ; \
  876. if (!metro_mute_is_bool) \
  877. Trace::TraceTypeMismatch(metro , CONFIG::IS_MUTED_KEY , \
  878. CONFIG::BOOL_TYPE , metro [CONFIG::IS_MUTED_ID ] ) ; \
  879. if (!metro_source_is_int) \
  880. Trace::TraceTypeMismatch(metro , CONFIG::SOURCE_N_KEY , \
  881. CONFIG::INT_TYPE , metro [CONFIG::SOURCE_N_ID ] ) ; \
  882. if (!metro_stereo_is_int) \
  883. Trace::TraceTypeMismatch(metro , CONFIG::STEREO_KEY , \
  884. CONFIG::INT_TYPE , metro [CONFIG::STEREO_ID ] ) ; \
  885. if (!metro_vuleft_is_double) \
  886. Trace::TraceTypeMismatch(metro , CONFIG::VU_LEFT_KEY , \
  887. CONFIG::DOUBLE_TYPE , metro [CONFIG::VU_LEFT_ID ] ) ; \
  888. if (!metro_vuright_is_double) \
  889. Trace::TraceTypeMismatch(metro , CONFIG::VU_RIGHT_KEY , \
  890. CONFIG::DOUBLE_TYPE , metro [CONFIG::VU_RIGHT_ID ] ) ; \
  891. \
  892. /* modify return value */ \
  893. is_valid = is_valid && \
  894. master_channel_has_name_property && master_name_is_string && \
  895. master_channel_has_volume_property && master_volume_is_double && \
  896. master_channel_has_pan_property && master_pan_is_double && \
  897. master_channel_has_mute_property && master_mute_is_bool && \
  898. master_channel_has_stereo_property && master_stereo_is_int && \
  899. master_channel_has_vuleft_property && master_vuleft_is_double && \
  900. master_channel_has_vuright_property && master_vuright_is_double && \
  901. metro_channel_has_name_property && metro_name_is_string && \
  902. metro_channel_has_volume_property && metro_volume_is_double && \
  903. metro_channel_has_pan_property && metro_pan_is_double && \
  904. metro_channel_has_mute_property && metro_mute_is_bool && \
  905. metro_channel_has_source_property && metro_source_is_int && \
  906. metro_channel_has_stereo_property && metro_stereo_is_int && \
  907. metro_channel_has_vuleft_property && metro_vuleft_is_double && \
  908. metro_channel_has_vuleft_property && metro_vuright_is_double ;
  909. #define DEBUG_TRACE_VALIDATE_CONFIG \
  910. /* NOTE: these checks normally should be unnecessary in the Release build */ \
  911. /* all tree nodes and properties will exist after sanitizeConfig() */ \
  912. /* and will be of the proper types after restoreVarTypeInfo() */ \
  913. /* only transient channels must be validated explicitly */ \
  914. \
  915. ValueTree root = this->configRoot ; \
  916. ValueTree gui = this->gui ; \
  917. ValueTree client = this->client ; \
  918. ValueTree blacklist = this->blacklist ; \
  919. ValueTree audio = this->audio ; \
  920. ValueTree server = this->server ; \
  921. ValueTree master = this->masterChannels.getChildWithName(CONFIG::MASTER_ID) ; \
  922. ValueTree metro = this->masterChannels.getChildWithName(CONFIG::METRO_ID ) ; \
  923. \
  924. /* trace subscribed sub-trees */ \
  925. if (!root_is_valid ) Trace::TraceInvalidNode(CONFIG::STORAGE_KEY ) ; \
  926. if (!gui_is_valid ) Trace::TraceInvalidNode(CONFIG::GUI_KEY ) ; \
  927. if (!client_is_valid ) Trace::TraceInvalidNode(CONFIG::CLIENT_KEY ) ; \
  928. if (!blacklist_is_valid ) Trace::TraceInvalidNode(CONFIG::BLACKLIST_KEY) ; \
  929. if (!audio_is_valid ) Trace::TraceInvalidNode(CONFIG::AUDIO_KEY ) ; \
  930. if (!server_is_valid ) Trace::TraceInvalidNode(CONFIG::SERVER_KEY ) ; \
  931. if (!servers_is_valid ) Trace::TraceInvalidNode(CONFIG::SERVERS_KEY ) ; \
  932. if (!master_channels_is_valid) Trace::TraceInvalidNode(CONFIG::MASTERS_KEY ) ; \
  933. if (!local_channels_is_valid ) Trace::TraceInvalidNode(CONFIG::LOCALS_KEY ) ; \
  934. if (!remote_users_is_valid ) Trace::TraceInvalidNode(CONFIG::REMOTES_KEY ) ; \
  935. \
  936. /* trace sub-trees properties and datatypes */ \
  937. DEBUG_VALIDATE_CONFIG_DEFAULTS \
  938. DEBUG_VALIDATE_CONFIG_ROOT \
  939. DEBUG_VALIDATE_CONFIG_GUI \
  940. DEBUG_VALIDATE_CONFIG_CLIENT \
  941. DEBUG_VALIDATE_CONFIG_BLACKLIST \
  942. DEBUG_VALIDATE_CONFIG_AUDIO \
  943. DEBUG_VALIDATE_CONFIG_SERVER \
  944. DEBUG_VALIDATE_CONFIG_MASTERS
  945. #define DEBUG_TRACE_SANITIZE_GUI \
  946. if (is_invalid_font_size ) \
  947. Trace::TraceInvalidValue(this->gui , CONFIG::FONT_SIZE_ID) ; \
  948. if (is_invalid_update_ivl) \
  949. Trace::TraceInvalidValue(this->gui , CONFIG::UPDATE_IVL_ID) ;
  950. //#define DEBUG_TRACE_SANITIZE_CLIENT // TODO: (issue #61)
  951. //#define DEBUG_TRACE_SANITIZE_BLACKLIST // TODO: (issue #61)
  952. //#define DEBUG_TRACE_SANITIZE_AUDIO // TODO: (issue #61)
  953. //#define DEBUG_TRACE_SANITIZE_SERVER // TODO: (issue #61)
  954. //#define DEBUG_TRACE_SANITIZE_USER // TODO: (issue #61)
  955. //#define DEBUG_TRACE_SANITIZE_CHANNEL // TODO: (issue #61)
  956. #define DEBUG_TRACE_CLOBBER_CONFIG \
  957. Trace::TraceError("stored config invalid - restoring defaults and re-initializing") ;
  958. #if TRACE_STORE_CONFIG_VB
  959. # define DEBUG_TRACE_STORE_CONFIG \
  960. Trace::TraceConfig("storing config xml '" + configXmlFile.getFullPathName() + \
  961. "'=\n" + configRoot.toXmlString() ) ;
  962. #else // TRACE_STORE_CONFIG_VB
  963. # define DEBUG_TRACE_STORE_CONFIG \
  964. Trace::TraceConfig("storing config xml '" + configXmlFile.getFullPathName() + "'") ;
  965. #endif // TRACE_STORE_CONFIG_VB
  966. #define DEBUG_TRACE_STORE_SERVER Trace::TraceConfig("creating storage for host '" + host +"'") ;
  967. #define DEBUG_TRACE_CONFIG_VALUE_CHANGED \
  968. bool is_status_change = a_value.refersToSameSourceAs(LinJam::Status) ; \
  969. String a_var = (is_status_change)? "Status" : "unknown" ; \
  970. String status = Trace::Status2String(int(LinJam::Status.getValue())) ; \
  971. if (DEBUG_TRACE_VB && is_status_change) \
  972. Trace::TraceEvent("value changed => " + a_var + " => " + status) ;
  973. #define DEBUG_TRACE_CONFIG_TREE_CHANGED \
  974. String node = String(a_node.getType()) ; \
  975. String parent = String(a_node.getParent().getType()) ; \
  976. String key = String(a_key) ; \
  977. String val = a_node[a_key].toString() ; \
  978. if (a_key != CONFIG::VU_LEFT_ID && a_key != CONFIG::VU_RIGHT_ID) \
  979. Trace::TraceEvent("value changed for " + parent + \
  980. " => " + node + "[" + key + "] => " + val) ;
  981. #define DEBUG_TRACE_CONFIG_TREE_ADDED \
  982. if (a_parent_node == this->blacklist) \
  983. Trace::TraceEvent("node added to " + String(a_parent_node.getType()) + \
  984. " => " + String(a_node.getType()) ) ;
  985. #define DEBUG_TRACE_CONFIG_TREE_REMOVED \
  986. if (a_parent_node == this->blacklist) \
  987. Trace::TraceEvent("node removed from " + String(a_parent_node.getType()) + \
  988. " => " + String(a_node.getType()) ) ;
  989. /* channels */
  990. #define DEBUG_TRACE_STEREO_STATUS \
  991. bool is_stereo_l = stereo_status == CONFIG::STEREO_L ; \
  992. bool is_stereo_r = stereo_status == CONFIG::STEREO_R ; \
  993. String status = String((is_stereo_l) ? "STEREO_L" : \
  994. (is_stereo_r) ? "STEREO_R" : "MONO" ) + \
  995. String((is_paired ) ? " (paired)" : " (unpaired)") ; \
  996. String pair_status = ((pair_stereo_status == CONFIG::STEREO_L) ? \
  997. "STEREO_L" : "STEREO_R") + String(" (paired)") ; \
  998. String dbgA = "setting remote channel '" ; String dbgB = "' status to " ; \
  999. if (is_paired) Trace::TraceConfig(dbgA + pair_name + dbgB + pair_status) ; \
  1000. Trace::TraceConfig(dbgA + channel_name + dbgB + status) ;
  1001. #define DEBUG_TRACE_MONO_STATUS \
  1002. String dbgA = "setting remote channel '" ; String dbgB = "' status to MONO" ; \
  1003. String pair_name = (has_l_pair)? l_pair_name : r_pair_name ; \
  1004. if (has_orphaned_pair) \
  1005. Trace::TraceConfig(dbgA + pair_name + dbgB + " (orphaned)") ; \
  1006. if (ParseStereoStatus(channel_name) == CONFIG::MONO) \
  1007. Trace::TraceConfig(dbgA + channel_name + dbgB) ;
  1008. #define DEBUG_TRACE_ADD_CHANNEL_STORE \
  1009. String user_id = String(channels_store.getType()) ; \
  1010. int ch_idx = int(new_channel_node[CONFIG::CHANNEL_IDX_ID]) ; \
  1011. String channel_id = String(MakeChannelId(ch_idx)) ; \
  1012. String channel_name = LinJam::GetStoredChannelName(new_channel_node) ; \
  1013. bool is_local = channels_store == this->localChannels ; \
  1014. String group = (is_local)? "local" : "remote" ; \
  1015. String dbgA = "created storage for new " ; \
  1016. String dbgB = group + " " + channel_id + " '" + channel_name + "'" ; \
  1017. if (!channels_store.isValid()) \
  1018. Trace::TraceError("invlaid parent creating channel storage for '" + dbgB) ; \
  1019. else if (!new_channel_node.isValid()) \
  1020. Trace::TraceError("invlaid node creating " + user_id + " channel storage") ; \
  1021. if (new_channel_node.getParent() == channels_store) \
  1022. Trace::TraceConfig("storage exists for " + dbgB) ; \
  1023. else if (is_local) \
  1024. Trace::TraceConfig(dbgA + dbgB) ; \
  1025. else Trace::TraceConfig(dbgA + dbgB + " for '" + user_id + "'") ; \
  1026. if (TRACE_LOCAL_CHANNELS_VB) \
  1027. DBG(Trace::DumpStoredChannels() + Trace::DumpClientChannels()) ;
  1028. #define DEBUG_TRACE_REMOVE_CHANNEL_STORE \
  1029. String channel_id = String(channel_store.getType()) ; \
  1030. String channel_name = LinJam::GetStoredChannelName(channel_store) ; \
  1031. String user_id = String(channels_store.getType()) ; \
  1032. String dbgA = "destroyed storage for " ; \
  1033. String dbgB = " " + channel_id + " '" + channel_name + "' " ; \
  1034. if (channel_store.getParent() == channels_store) { \
  1035. if (channels_store == this->localChannels) \
  1036. Trace::TraceConfig(dbgA + "local" + dbgB) ; \
  1037. else Trace::TraceConfig(dbgA + "remote" + dbgB + "for '" + user_id + "'") ; }
  1038. #define DEBUG_TRACE_ADD_REMOTE_USER_STORE \
  1039. Trace::TraceEvent("user joined => '" + String(user_id) + "'") ; \
  1040. Trace::TraceConfig("created storage for new remote user " + String(user_id)) ; \
  1041. if (TRACE_REMOTE_CHANNELS_VB) \
  1042. { \
  1043. Identifier host = MakeHostId(str(this->server[CONFIG::HOST_ID])) ; \
  1044. bool has_bot = NETWORK::KNOWN_BOTS.getChildWithName(host).isValid() ; \
  1045. bool hide_bots = has_bot && bool(this->client[CONFIG::SHOULD_HIDE_BOTS_ID]) ; \
  1046. float u_vol = CONFIG::DEFAULT_VOLUME ; \
  1047. bool u_mute = CONFIG::DEFAULT_IS_MUTED ; \
  1048. float u_pan = CONFIG::DEFAULT_PAN ; \
  1049. int u_idx = -1 ; String u_name ; Identifier u_id ; \
  1050. while ((u_name = LinJam::GetRemoteUserName(++u_idx)).isNotEmpty()) \
  1051. { u_id = MakeUserId(u_name) ; if (user_id == u_id) break ; } \
  1052. DEBUG_TRACE_REMOTE_CHANNELS \
  1053. }
  1054. #else // DEBUG
  1055. // storage
  1056. #define DEBUG_TRACE_LOAD_CONFIG ;
  1057. #define DEBUG_TRACE_DUMP_CONFIG ;
  1058. #define DEBUG_TRACE_CONFIG_TYPES_VB ;
  1059. #define DEBUG_TRACE_CONFIG_TYPES_VB_EACH ;
  1060. #define DEBUG_TRACE_VALIDATE_USER ;
  1061. #define DEBUG_TRACE_VALIDATE_CHANNEL ;
  1062. #define DEBUG_TRACE_VALIDATE_CONFIG ;
  1063. #define DEBUG_TRACE_SANITIZE_GUI ;
  1064. //#define DEBUG_TRACE_SANITIZE_CLIENT ;
  1065. //#define DEBUG_TRACE_SANITIZE_BLACKLIST ;
  1066. //#define DEBUG_TRACE_SANITIZE_AUDIO ;
  1067. //#define DEBUG_TRACE_SANITIZE_SERVER ;
  1068. //#define DEBUG_TRACE_SANITIZE_USER ;
  1069. //#define DEBUG_TRACE_SANITIZE_CHANNEL ;
  1070. #define DEBUG_TRACE_CLOBBER_CONFIG ;
  1071. #define DEBUG_TRACE_STORE_CONFIG ;
  1072. #define DEBUG_TRACE_STORE_SERVER ;
  1073. #define DEBUG_TRACE_CONFIG_VALUE_CHANGED ;
  1074. #define DEBUG_TRACE_CONFIG_TREE_CHANGED ;
  1075. #define DEBUG_TRACE_CONFIG_TREE_ADDED ;
  1076. #define DEBUG_TRACE_CONFIG_TREE_REMOVED ;
  1077. // channels
  1078. #define DEBUG_TRACE_STEREO_STATUS ;
  1079. #define DEBUG_TRACE_MONO_STATUS ;
  1080. #define DEBUG_TRACE_ADD_CHANNEL_STORE ;
  1081. #define DEBUG_TRACE_REMOVE_CHANNEL_STORE ;
  1082. #define DEBUG_TRACE_ADD_REMOTE_USER_STORE ;
  1083. #endif // DEBUG