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

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