Programmable real-time audio signal processing application
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

kcApp.h 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426
  1. #ifndef kcApp_h
  2. #define kcApp_h
  3. extern "C" struct cmApBufState_str;
  4. class Fl_Menu_Bar;
  5. class Fl_HSplitter;
  6. class Fl_Text_Buffer;
  7. class Fl_Text_Display;
  8. class Fl_Box;
  9. class Fl_Tabs;
  10. class Fl_Check_Button;
  11. class Fl_Value_Slider;
  12. class Fl_Menu_Button;
  13. class Fl_File_Btn;
  14. class Fl_Select_Browser;
  15. class Fl_Valuator;
  16. class Fl_Value_Input;
  17. class Fl_Progress;
  18. class tlCtl;
  19. class kcApp : public Fl_Double_Window
  20. {
  21. public:
  22. typedef unsigned kcKmRC_t;
  23. enum
  24. {
  25. kOkKmRC,
  26. kEngFailKmRC,
  27. kMemFailKmRC,
  28. kPrefsNotFoundKmRC,
  29. kPrefWriteFailKmRC,
  30. kPrefLoadFailKmRC,
  31. kPrefFailKmRC,
  32. kPrefSetFailKmRC,
  33. kMlistLoadFailKmRC,
  34. kJsonFailKmRC,
  35. kDeserialFailKmRC,
  36. kPrintQueFailKmRC,
  37. };
  38. kcApp(int w, int h, const char *l, int argc, char *argv[]);
  39. virtual ~kcApp();
  40. kcKmRC_t audioDspInitialize( cmCtx_t* ctx, cmRptPrintFunc_t printFunc, void* printFuncArg );
  41. kcKmRC_t audioDspFinalize();
  42. bool audioDspIsValid();
  43. void print( const char* fmt, ... );
  44. void vprint( const char* fmt, va_list vl );
  45. private:
  46. enum
  47. {
  48. kMenuH = 30,
  49. kStatusH = 30,
  50. kIndH = 25,
  51. kIndW = 25,
  52. kSsPhaseMax = 20
  53. };
  54. //Fl_Menu_Bar* menu;
  55. Fl_HSplitter* splt;
  56. Fl_Box* ind[4];
  57. Fl_Text_Buffer* buf;
  58. Fl_Text_Display* con;
  59. Fl_Tabs* tabs;
  60. Fl_Check_Button* ena_chk;
  61. //Fl_Group* ctl_grp;
  62. Fl_Menu_Button* as_btn;
  63. Fl_Menu_Button* ai_btn;
  64. Fl_Menu_Button* ao_btn;
  65. Fl_Menu_Button* pgm_btn;
  66. Fl_Menu_Button* ss_btn;
  67. Fl_Menu_Button* sr_btn;
  68. Fl_Group* mstr_grp;
  69. enum
  70. {
  71. kSldrTypeId,
  72. kNumbTypeId,
  73. kTextTypeId,
  74. kButnTypeId,
  75. kChckTypeId,
  76. kLablTypeId,
  77. kFnamTypeId,
  78. kMlstTypeId,
  79. kMetrTypeId,
  80. kTmlnTypeId,
  81. kSldrMinArgIdx = 0,
  82. kSldrMaxArgIdx = 1,
  83. kSldrStpArgIdx = 2,
  84. kSldrValArgIdx = 3,
  85. kSldrLblArgIdx = 4,
  86. kSldrVarCnt = 5,
  87. kTextValArgIdx = 0,
  88. kTextLblArgIdx = 1,
  89. kTextVarCnt = 2,
  90. kButnValArgIdx = 0,
  91. kButnLblArgIdx = 1,
  92. kButnVarCnt = 2,
  93. kLablValArgIdx = 0,
  94. kLablAlignArgIdx= 1,
  95. kLablVarCnt = 2,
  96. kChckValArgIdx = 0,
  97. kChckLblArgIdx = 1,
  98. kChckVarCnt = 2,
  99. kFnamValArgIdx = 0,
  100. kFnamPatArgIdx = 1,
  101. kFnamDirArgIdx = 2,
  102. kFnamVarCnt = 3,
  103. kMlstHgtArgIdx = 0,
  104. kMlstSelArgIdx = 1,
  105. kMlstLstArgIdx = 2,
  106. kMlstVarCnt = 3,
  107. kMetrMinArgIdx = 0,
  108. kMetrMaxArgIdx = 1,
  109. kMetrValArgIdx = 2,
  110. kMetrLblArgIdx = 3,
  111. kMetrVarCnt = 4,
  112. kTmlnValArgIdx = 0,
  113. kTmlnLblArgIdx = 1,
  114. kTmlnFileArgIdx= 2,
  115. kTmlnPathArgIdx= 3,
  116. kTmlnVarCnt = 4
  117. };
  118. enum
  119. {
  120. kEnableBtnId = 1,
  121. kAudDevRptBtnId,
  122. kAudioSysCfgBtnId,
  123. kInAudDevBtnId,
  124. kOutAudDevBtnId,
  125. kPgmBtnId,
  126. kSubSystemIdxBtnId,
  127. kSrateBtnId,
  128. kTestBtnId
  129. };
  130. enum
  131. {
  132. k44100SrateIdx,
  133. k48000SrateIdx,
  134. k96000SrateIdx
  135. };
  136. typedef struct sldr_str
  137. {
  138. union
  139. {
  140. Fl_Value_Slider* sldr;
  141. Fl_Value_Input* numb;
  142. } u;
  143. Fl_Valuator* val;
  144. double defaultVal;
  145. unsigned varIdArray[ kSldrVarCnt ];
  146. } sldr_t;
  147. typedef struct text_str
  148. {
  149. Fl_Input* text;
  150. char* val;
  151. unsigned varIdArray[ kTextVarCnt ];
  152. } text_t;
  153. typedef struct butn_str
  154. {
  155. Fl_Button* butn;
  156. double val;
  157. unsigned varIdArray[ kButnVarCnt ];
  158. } butn_t;
  159. typedef struct chck_str
  160. {
  161. Fl_Check_Button* chck;
  162. double val;
  163. unsigned varIdArray[ kChckVarCnt ];
  164. } chck_t;
  165. typedef struct labl_str
  166. {
  167. Fl_Box* box;
  168. unsigned varIdArray[ kLablVarCnt ];
  169. } labl_t;
  170. typedef struct fname_str
  171. {
  172. Fl_File_Btn* fnam;
  173. unsigned varIdArray[ kFnamVarCnt ];
  174. } fnam_t;
  175. typedef struct mlst_str
  176. {
  177. Fl_Select_Browser* mlst;
  178. Fl_Menu_Button* mbtn;
  179. int sel;
  180. unsigned varIdArray[ kMlstVarCnt ];
  181. } mlst_t;
  182. typedef struct metr_str
  183. {
  184. Fl_Progress* prog;
  185. unsigned varIdArray[ kMetrVarCnt ];
  186. } metr_t;
  187. typedef struct tmln_str
  188. {
  189. tlCtl* tlctl;
  190. char* val;
  191. unsigned varIdArray[ kTmlnVarCnt ];
  192. } tmln_t;
  193. typedef struct ctl_str
  194. {
  195. kcApp* thisPtr;
  196. unsigned asSubIdx;
  197. unsigned typeId;
  198. unsigned instId;
  199. Fl_Widget* wdgtPtr;
  200. bool mstrFl;
  201. union
  202. {
  203. sldr_t sldr;
  204. text_t text;
  205. butn_t butn;
  206. chck_t chck;
  207. labl_t labl;
  208. fnam_t fnam;
  209. mlst_t mlst;
  210. metr_t metr;
  211. tmln_t tmln;
  212. } u;
  213. struct ctl_str* linkPtr;
  214. } ctl_t;
  215. typedef struct page_str
  216. {
  217. Fl_Group* grp;
  218. struct page_str* link;
  219. page_str() : grp(NULL), link(NULL) {}
  220. } page_t;
  221. enum
  222. {
  223. kUpdateSsIdx,
  224. kWakeupSsIdx,
  225. kMsgSsIdx,
  226. kAudioCbSsIdx,
  227. kProgSsCnt
  228. };
  229. // each audio sub-system is represented by an ss_t record in _ssArray[_ssCnt]
  230. typedef struct ss_str
  231. {
  232. Fl_Progress* prog[kProgSsCnt]; // status indicator controls
  233. unsigned cnt[kProgSsCnt]; // previous status count value
  234. } ss_t;
  235. cmCtx_t _ctx;
  236. Fl_Menu_Bar* _menu;
  237. cmAdlH_t _adlH;
  238. cmAiH_t _aiH;
  239. unsigned _statIdx;
  240. page_t* _pageList;
  241. ctl_t* _ctlList;
  242. const cmChar_t* _prefFn;
  243. cmPrH_t _prH;
  244. const cmChar_t* _prefsFn;
  245. bool _stopTimerFl;
  246. cmJsonH_t _jsH;
  247. bool _newPageFl;
  248. unsigned _incrColW;
  249. unsigned _colW;
  250. bool _horzBordFl;
  251. unsigned _horzBord;
  252. unsigned _closeCnt;
  253. unsigned _ssCnt; // count of audio system sub-systems (set in _handleSsInitMsg())
  254. ss_t* _ssArray;
  255. int _ssPhase;
  256. bool _ssUpdateFl;
  257. cmTsQueueH_t _printqH; // thread-safe queue for controlling access to the output console from multiple threads
  258. void resize(int x, int y, int w, int h);
  259. void _createSetupDlg(Fl_Group* grp);
  260. void _createMenu( int w, int h );
  261. void _createPage( const char* title );
  262. unsigned _getCtlCount() const;
  263. void _clearCtlList(bool mstrFl);
  264. void _clearSsArray();
  265. void _getNewCtlPosn( const cmDspUiHdr_t* m, int& x, int& y, int& w, int& h );
  266. ctl_t* _findCtl( unsigned instId, unsigned asSubIdx, unsigned mstrFl=false );
  267. ctl_t* _createCtl( const cmDspUiHdr_t* m, unsigned typeId, int& x, int& y, int& w, int& h, bool posnFl=true );
  268. void _insertNewCtl( ctl_t* cp, const cmDspUiHdr_t* m, Fl_Widget* wdgt, unsigned* varIdArray, unsigned varIdCnt );
  269. void _createSlider( const cmDspUiHdr_t* m );
  270. void _setSldrValue( ctl_t* cp, unsigned instVarId, const cmDspValue_t* vp );
  271. void _createText( const cmDspUiHdr_t* m );
  272. void _setTextValue( ctl_t* cp, unsigned instVarId, const cmDspValue_t* vp );
  273. void _createFnameCtl( const cmDspUiHdr_t* m );
  274. void _setFnamValue( ctl_t* cp, unsigned instVarId, const cmDspValue_t* vp );
  275. void _createMlistCtl( const cmDspUiHdr_t* m );
  276. kcKmRC_t _loadMlist( ctl_t* cp, const cmJsonNode_t* np );
  277. void _setMlistValue( ctl_t* cp, unsigned instVarId, const cmDspValue_t* vp );
  278. void _createMeter( const cmDspUiHdr_t* m );
  279. void _setMeterValue( ctl_t* cp, unsigned instVarId, const cmDspValue_t* vp );
  280. void _createButton( const cmDspUiHdr_t* m );
  281. void _setButtonValue( ctl_t* cp, unsigned instVarId, const cmDspValue_t* vp );
  282. void _createCheck( const cmDspUiHdr_t* m );
  283. void _setCheckValue( ctl_t* cp, unsigned instVarId, const cmDspValue_t* vp );
  284. void _createLabel( const cmDspUiHdr_t* m );
  285. void _setLabelValue( ctl_t* cp, unsigned instVarId, const cmDspValue_t* vp );
  286. void _createTmln( const cmDspUiHdr_t* m );
  287. void _setTmlnValue( ctl_t* cp, unsigned instVarId, const cmDspValue_t* vp );
  288. void _newColumn( const cmDspUiHdr_t* m );
  289. void _insertAudioSysCfgLabel(unsigned long idx, const cmChar_t* label );
  290. void _insertDeviceLabel( unsigned long idx, bool inputFl, const cmChar_t* label );
  291. void _insertProgramLabel( unsigned long idx, const cmChar_t* label );
  292. void _insertSubSysCnt( unsigned long subSysCnt );
  293. unsigned _getCurAudioSubSysIdx();
  294. void _setMenuButton( Fl_Menu_Button* b, unsigned value, const char* dfltLabel );
  295. void _setDeviceMenuButton( unsigned asSubIdx, bool inputFl, unsigned devIdx );
  296. void _setSampleRateBtn( unsigned value );
  297. void _updateMeters( unsigned asSubIdx, unsigned devIdx, unsigned inFl, const double* meterArray, unsigned meterCnt );
  298. void _updateSsStatusIndicator( unsigned asSubIdx, unsigned indicatorIdx, unsigned cnt );
  299. void _printStatusCounts();
  300. void _handleStatusMsg( const cmAudioSysStatus_t* st, const double* iMeterArray, const double* oMeterArray );
  301. void _clearStatusIndicators();
  302. void _sendMasterUiMsg( unsigned asSubIdx, unsigned selId, unsigned instId, unsigned instVarId, const cmDspValue_t* v );
  303. void _sendMasterUiValue(unsigned asSubIdx, unsigned instId, const double* v, unsigned vn, const cmChar_t* text );
  304. void _createMasterCtl( unsigned asSubIdx, unsigned selId, unsigned instId, unsigned varCnt, const double* dv, unsigned dn, const cmChar_t* label);
  305. void _handleSsInitMsg( const cmAudioSysSsInitMsg_t* m, const cmChar_t* inDevLabel, const cmChar_t* outDevLabel );
  306. void _onRecvValue( const cmDspUiHdr_t* m );
  307. void _handleUiMsg( const cmDspUiHdr_t* m );
  308. void _getEngMsg();
  309. static cmRC_t _s_handleSsInitMsg( void* cbDataPtr, const cmAudioSysSsInitMsg_t* r, const char* iDevLabel, const char* oDevLabel );
  310. static cmRC_t _s_handleStatusMsg( void* cbDataPtr, const cmAudioSysStatus_t* r, const double* iMeterArray, const double* oMeterArray );
  311. static cmRC_t _s_handleUiMsg( void* cbDataPtr, const cmDspUiHdr_t* r );
  312. static kcApp* _getApp( Fl_Widget* w );
  313. kcKmRC_t _restartEngine();
  314. void _testStub();
  315. // main app callback
  316. static void _s_callback(Fl_Widget* wp, void* data);
  317. void _callback(void* data);
  318. // idle callback
  319. static void _s_on_idle(void* data);
  320. void _on_idle();
  321. // timer callback
  322. static void _s_status_timeout_cb(void* userPtr);
  323. bool _status_timeout_cb();
  324. static void _s_file_new_cb(Fl_Widget *w, void *data);
  325. void _file_new_cb(Fl_Widget *w);
  326. static void _s_file_open_cb(Fl_Widget *w, void *data);
  327. void _file_open_cb(Fl_Widget *w);
  328. static void _s_edit_copy_cb(Fl_Widget *w, void *data);
  329. void _edit_copy_cb(Fl_Widget *w);
  330. static void _s_edit_paste_cb(Fl_Widget *w, void *data);
  331. void _edit_paste_cb(Fl_Widget *w);
  332. static void _s_btn_cb(Fl_Widget* w, long data);
  333. void _btn_cb(Fl_Widget* w, long arg);
  334. static void _s_ctl_cb(Fl_Widget* w, void* data);
  335. void _ctl_cb(ctl_t* cp);
  336. static void _s_tab_cb(Fl_Widget* w, void* data);
  337. void _tab_cb(Fl_Widget* w);
  338. //
  339. static void _s_print( void* userPtr, const char* text );
  340. // called internally by cmTsQueueDequeue() to send text to _print()
  341. static cmRC_t _s_print_queue_cb(void* userCbPtr, unsigned msgByteCnt, const void* msgDataPtr );
  342. // called periodically to check the print queue for waiting text.
  343. void _checkPrintQueue();
  344. // send a string of text directly to the output console window
  345. void _print( const char* text );
  346. };
  347. #endif