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

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