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 13KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482
  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. kPrefsFailKmRC,
  27. kMlistLoadFailKmRC,
  28. kJsonFailKmRC,
  29. kDeserialFailKmRC,
  30. kPrintQueFailKmRC,
  31. };
  32. class kcApp : public Fl_Double_Window, public tlCtlRspdr
  33. {
  34. public:
  35. typedef unsigned kcKmRC_t;
  36. kcApp(cmCtx_t* ctx, cmPrH_t prH, cmTsMp1cH_t printQH, int w, int h, const cmChar_t* title, cmAiH_t aiH, int argc, char* argv[] );
  37. virtual ~kcApp();
  38. void resize(int x, int y, int w, int h);
  39. virtual void tlCtlNewTimeLineFile( tlCtl* tlCtl, const cmChar_t* fn );
  40. virtual void tlCtlNewScoreFile( tlCtl* tlCtl, const cmChar_t* fn );
  41. void print( const char* fmt, ... );
  42. void vprint( const char* fmt, va_list vl );
  43. private:
  44. enum
  45. {
  46. kMenuH = 30,
  47. kStatusH = 30,
  48. kIndH = 25,
  49. kIndW = 25,
  50. kSsPhaseMax = 20
  51. };
  52. enum
  53. {
  54. kSldrTypeId,
  55. kNumbTypeId,
  56. kTextTypeId,
  57. kButnTypeId,
  58. kChckTypeId,
  59. kLablTypeId,
  60. kFnamTypeId,
  61. kMlstTypeId,
  62. kMetrTypeId,
  63. kTmlnTypeId,
  64. kScorTypeId,
  65. kTksbTypeId,
  66. kTksrTypeId,
  67. kTwodTypeId,
  68. kSldrMinArgIdx = 0,
  69. kSldrMaxArgIdx = 1,
  70. kSldrStpArgIdx = 2,
  71. kSldrValArgIdx = 3,
  72. kSldrLblArgIdx = 4,
  73. kSldrVarCnt = 5,
  74. kTextValArgIdx = 0,
  75. kTextLblArgIdx = 1,
  76. kTextVarCnt = 2,
  77. kButnValArgIdx = 0,
  78. kButnLblArgIdx = 1,
  79. kButnVarCnt = 2,
  80. kLablValArgIdx = 0,
  81. kLablAlignArgIdx= 1,
  82. kLablVarCnt = 2,
  83. kChckValArgIdx = 0,
  84. kChckLblArgIdx = 1,
  85. kChckVarCnt = 2,
  86. kFnamValArgIdx = 0,
  87. kFnamPatArgIdx = 1,
  88. kFnamDirArgIdx = 2,
  89. kFnamVarCnt = 3,
  90. kMlstHgtArgIdx = 0,
  91. kMlstSelArgIdx = 1,
  92. kMlstLstArgIdx = 2,
  93. kMlstVarCnt = 3,
  94. kMetrMinArgIdx = 0,
  95. kMetrMaxArgIdx = 1,
  96. kMetrValArgIdx = 2,
  97. kMetrLblArgIdx = 3,
  98. kMetrVarCnt = 4,
  99. kTmlnFileArgIdx= 0,
  100. kTmlnPathArgIdx= 1,
  101. kTmlnSelArgIdx = 2,
  102. kTmlnMeasArgIdx= 3,
  103. kTmlnCursArgIdx= 4,
  104. kTmlnVarCnt = 5,
  105. kScorFileArgIdx = 0,
  106. kScorSelArgIdx = 1,
  107. kScorSmpIdxArgIdx = 2,
  108. kScorPitchArgIdx = 3,
  109. kScorVelArgIdx = 4,
  110. kScorLocIdxArgIdx = 5,
  111. kScorEvtIdxArgIdx = 6,
  112. kScorDynArgIdx = 7,
  113. kScorValTypeArgIdx = 8,
  114. kScorValueArgIdx = 9,
  115. kScorMeasArgIdx = 10,
  116. kScorVarCnt = 11,
  117. kTksbFileArgIdx = 0,
  118. kTksbPtrArgIdx = 1,
  119. kTksbSelArgIdx = 2,
  120. kTksbRefreshArgIdx = 3,
  121. kTksbVarCnt = 4,
  122. kTksrPtrArgIdx = 0,
  123. kTksrRefreshArgIdx = 1,
  124. kTksrSelArgIdx = 2,
  125. kTksrVarCnt = 3,
  126. kTwodXArgIdx = 0,
  127. kTwodYArgIdx = 1,
  128. kTwodRadiusArgIdx = 2,
  129. kTwodAngleArgIdx = 3,
  130. kTwodVarCnt = 4
  131. };
  132. enum
  133. {
  134. kEnableBtnId = 1,
  135. kAudDevRptBtnId,
  136. kAudioSysCfgBtnId,
  137. kInAudDevBtnId,
  138. kOutAudDevBtnId,
  139. kPgmBtnId,
  140. kSubSystemIdxBtnId,
  141. kSrateBtnId,
  142. kTestBtnId,
  143. kPrintPgmBtnId,
  144. kAboutMenuId,
  145. kQuitMenuId
  146. };
  147. enum
  148. {
  149. k44100SrateIdx,
  150. k48000SrateIdx,
  151. k96000SrateIdx
  152. };
  153. typedef struct sldr_str
  154. {
  155. union
  156. {
  157. Fl_Value_Slider* sldr;
  158. Fl_Value_Input* numb;
  159. } u;
  160. Fl_Valuator* val;
  161. double defaultVal;
  162. unsigned varIdArray[ kSldrVarCnt ];
  163. } sldr_t;
  164. typedef struct text_str
  165. {
  166. Fl_Input* text;
  167. char* val;
  168. unsigned varIdArray[ kTextVarCnt ];
  169. } text_t;
  170. typedef struct butn_str
  171. {
  172. Fl_Button* butn;
  173. double val;
  174. unsigned varIdArray[ kButnVarCnt ];
  175. } butn_t;
  176. typedef struct chck_str
  177. {
  178. Fl_Check_Button* chck;
  179. double val;
  180. unsigned varIdArray[ kChckVarCnt ];
  181. } chck_t;
  182. typedef struct labl_str
  183. {
  184. Fl_Box* box;
  185. unsigned varIdArray[ kLablVarCnt ];
  186. } labl_t;
  187. typedef struct fname_str
  188. {
  189. Fl_File_Btn* fnam;
  190. unsigned varIdArray[ kFnamVarCnt ];
  191. } fnam_t;
  192. typedef struct mlst_str
  193. {
  194. Fl_Select_Browser* mlst;
  195. Fl_Menu_Button* mbtn;
  196. int sel;
  197. unsigned varIdArray[ kMlstVarCnt ];
  198. } mlst_t;
  199. typedef struct metr_str
  200. {
  201. Fl_Progress* prog;
  202. unsigned varIdArray[ kMetrVarCnt ];
  203. } metr_t;
  204. typedef struct tmln_str
  205. {
  206. tlCtl* tlctl;
  207. char* val;
  208. unsigned varIdArray[ kTmlnVarCnt ];
  209. } tmln_t;
  210. typedef struct scor_str
  211. {
  212. tlCtl* tlctl;
  213. unsigned smpIdx;
  214. unsigned pitch;
  215. unsigned vel;
  216. unsigned evtIdx;
  217. unsigned locIdx;
  218. unsigned varId;
  219. unsigned varIdArray[ kScorVarCnt ];
  220. } scor_t;
  221. typedef struct tksb_str
  222. {
  223. tlCtl* tlctl;
  224. unsigned varIdArray[ kTksbVarCnt ];
  225. } tksb_t;
  226. typedef struct tksr_str
  227. {
  228. tlCtl* tlctl;
  229. unsigned varIdArray[ kTksrVarCnt ];
  230. } tksr_t;
  231. typedef struct twod_str
  232. {
  233. tlCtl* tlctl;
  234. unsigned varIdArray[ kTwodVarCnt ];
  235. } twod_t;
  236. typedef struct ctl_str
  237. {
  238. kcApp* thisPtr;
  239. unsigned asSubIdx;
  240. unsigned typeId;
  241. unsigned instId;
  242. Fl_Widget* wdgtPtr;
  243. bool mstrFl;
  244. union
  245. {
  246. sldr_t sldr;
  247. text_t text;
  248. butn_t butn;
  249. chck_t chck;
  250. labl_t labl;
  251. fnam_t fnam;
  252. mlst_t mlst;
  253. metr_t metr;
  254. tmln_t tmln;
  255. scor_t scor;
  256. tksb_t tksb;
  257. tksr_t tksr;
  258. twod_t twod;
  259. } u;
  260. struct ctl_str* linkPtr;
  261. } ctl_t;
  262. typedef struct page_str
  263. {
  264. Fl_Group* grp;
  265. struct page_str* link;
  266. page_str() : grp(NULL), link(NULL) {}
  267. } page_t;
  268. enum
  269. {
  270. kUpdateSsIdx,
  271. kWakeupSsIdx,
  272. kMsgSsIdx,
  273. kAudioCbSsIdx,
  274. kProgSsCnt
  275. };
  276. // each audio sub-system is represented by an ss_t record in _ssArray[_ssCnt]
  277. typedef struct ss_str
  278. {
  279. Fl_Progress* prog[kProgSsCnt]; // status indicator controls
  280. unsigned cnt[kProgSsCnt]; // previous status count value
  281. } ss_t;
  282. cmCtx_t* _ctx;
  283. cmPrH_t _prH;
  284. cmAiH_t _aiH;
  285. Fl_Menu_Bar* _menu;
  286. Fl_Text_Display* _con;
  287. Fl_Tabs* _tabs;
  288. Fl_Group* _mstr_grp;
  289. Fl_Menu_Button* _as_btn;
  290. Fl_Menu_Button* _ai_btn;
  291. Fl_Menu_Button* _ao_btn;
  292. Fl_Menu_Button* _pgm_btn;
  293. Fl_Menu_Button* _ss_btn;
  294. Fl_Menu_Button* _sr_btn;
  295. Fl_Check_Button* _ena_chk;
  296. page_t* _pageList;
  297. ctl_t* _ctlList;
  298. bool _stopTimerFl;
  299. bool _newPageFl;
  300. unsigned _incrColW;
  301. unsigned _colW;
  302. bool _horzBordFl;
  303. unsigned _horzBord;
  304. unsigned _ssCnt; // count of audio system sub-systems (set in _handleSsInitMsg())
  305. ss_t* _ssArray;
  306. int _ssPhase;
  307. bool _ssUpdateFl;
  308. cmTsMp1cH_t _printqH; // thread-safe queue for controlling access to the output console from multiple threads
  309. int _printFl;
  310. tlCtl* _tlCtl;
  311. void _createSetupDlg(Fl_Group* grp);
  312. void _createMenu( int w, int h );
  313. page_t* _createPage( const char* title );
  314. unsigned _getCtlCount() const;
  315. void _clearCtlList(bool mstrFl);
  316. void _clearSsArray();
  317. void _getNewCtlPosn( const cmDspUiHdr_t* m, int& x, int& y, int& w, int& h );
  318. ctl_t* _findCtl( unsigned instId, unsigned asSubIdx, unsigned mstrFl=false );
  319. ctl_t* _createCtl( const cmDspUiHdr_t* m, unsigned typeId, int& x, int& y, int& w, int& h, bool posnFl=true );
  320. void _insertNewCtl( ctl_t* cp, const cmDspUiHdr_t* m, Fl_Widget* wdgt, unsigned* varIdArray, unsigned varIdCnt );
  321. void _createSlider( const cmDspUiHdr_t* m );
  322. void _setSldrValue( ctl_t* cp, unsigned instVarId, const cmDspValue_t* vp );
  323. void _createText( const cmDspUiHdr_t* m );
  324. void _setTextValue( ctl_t* cp, unsigned instVarId, const cmDspValue_t* vp );
  325. void _createFnameCtl( const cmDspUiHdr_t* m );
  326. void _setFnamValue( ctl_t* cp, unsigned instVarId, const cmDspValue_t* vp );
  327. void _createMlistCtl( const cmDspUiHdr_t* m );
  328. kcKmRC_t _loadMlist( ctl_t* cp, const cmJsonNode_t* np );
  329. void _setMlistValue( ctl_t* cp, unsigned instVarId, const cmDspValue_t* vp );
  330. void _createMeter( const cmDspUiHdr_t* m );
  331. void _setMeterValue( ctl_t* cp, unsigned instVarId, const cmDspValue_t* vp );
  332. void _createButton( const cmDspUiHdr_t* m );
  333. void _setButtonValue( ctl_t* cp, unsigned instVarId, const cmDspValue_t* vp );
  334. void _createCheck( const cmDspUiHdr_t* m );
  335. void _setCheckValue( ctl_t* cp, unsigned instVarId, const cmDspValue_t* vp );
  336. void _createLabel( const cmDspUiHdr_t* m );
  337. void _setLabelValue( ctl_t* cp, unsigned instVarId, const cmDspValue_t* vp );
  338. void _createTmln( const cmDspUiHdr_t* m );
  339. void _setTmlnValue( ctl_t* cp, unsigned instVarId, const cmDspValue_t* vp );
  340. void _createScor( const cmDspUiHdr_t* m );
  341. void _setScorValue( ctl_t* cp, unsigned instVarId, const cmDspValue_t* vp );
  342. void _createTksb( const cmDspUiHdr_t* m );
  343. void _setTksbValue( ctl_t* cp, unsigned instVarId, const cmDspValue_t* vp );
  344. void _createTksr( const cmDspUiHdr_t* m );
  345. void _setTksrValue( ctl_t* cp, unsigned instVarId, const cmDspValue_t* vp );
  346. void _createTwod( const cmDspUiHdr_t* m );
  347. void _setTwodValue( ctl_t* cp, unsigned instVarId, const cmDspValue_t* vp );
  348. void _newColumn( const cmDspUiHdr_t* m );
  349. void _insertAudioSysCfgLabel(unsigned long idx, const cmChar_t* label );
  350. void _setDfltAudioSysCfg(unsigned long idx, const cmChar_t* label );
  351. void _insertDeviceLabel( unsigned long idx, bool inputFl, const cmChar_t* label );
  352. void _insertProgramLabel( unsigned long idx, const cmChar_t* label );
  353. void _setDfltProgram(unsigned long idx, const cmChar_t* label );
  354. void _insertSubSysCnt( unsigned long subSysCnt );
  355. unsigned _getCurAudioSubSysIdx();
  356. void _setMenuButton( Fl_Menu_Button* b, unsigned value, const char* dfltLabel );
  357. void _setDeviceMenuButton( unsigned asSubIdx, bool inputFl, unsigned devIdx );
  358. void _setSampleRateBtn( unsigned value );
  359. void _updateMeters( unsigned asSubIdx, unsigned devIdx, unsigned inFl, const double* meterArray, unsigned meterCnt );
  360. void _updateSsStatusIndicator( unsigned asSubIdx, unsigned indicatorIdx, unsigned cnt );
  361. void _printStatusCounts();
  362. void _clearStatusIndicators();
  363. void _sendMasterUiMsg( unsigned asSubIdx, unsigned selId, unsigned instId, unsigned instVarId, const cmDspValue_t* v );
  364. void _sendMasterUiValue(unsigned asSubIdx, unsigned instId, const double* v, unsigned vn, const cmChar_t* text );
  365. void _createMasterCtl( unsigned asSubIdx, unsigned selId, unsigned instId, unsigned varCnt, const double* dv, unsigned dn, const cmChar_t* label);
  366. void _onRecvValue( const cmDspUiHdr_t* m );
  367. void _getEngMsg();
  368. public:
  369. void _handleStatusMsg( const cmAudioSysStatus_t* st, const double* iMeterArray, const double* oMeterArray );
  370. void _handleSsInitMsg( const cmAudioSysSsInitMsg_t* m, const cmChar_t* inDevLabel, const cmChar_t* outDevLabel );
  371. void _handleUiMsg( const cmDspUiHdr_t* m );
  372. private:
  373. static kcApp* _getApp( Fl_Widget* w );
  374. void _onCloseApp();
  375. void _testStub();
  376. void _printPgm();
  377. // main app callback
  378. static void _s_callback(Fl_Widget* wp, void* data);
  379. void _callback(void* data);
  380. // timer callback
  381. static void _s_status_timeout_cb(void* userPtr);
  382. bool _status_timeout_cb();
  383. static void _s_menu_cb(Fl_Widget *w, void *data);
  384. static void _s_btn_cb(Fl_Widget* w, long data);
  385. void _btn_cb(Fl_Widget* w, long arg);
  386. static void _s_ctl_cb(Fl_Widget* w, void* data);
  387. void _ctl_cb(ctl_t* cp);
  388. static void _s_tab_cb(Fl_Widget* w, void* data);
  389. void _tab_cb(Fl_Widget* w);
  390. //
  391. static void _s_print( void* userPtr, const char* text );
  392. // called internally by cmTsQueueDequeue() to send text to _print()
  393. static cmRC_t _s_print_queue_cb(void* userCbPtr, unsigned msgByteCnt, const void* msgDataPtr );
  394. // called periodically to check the print queue for waiting text.
  395. void _checkPrintQueue();
  396. // send a string of text directly to the output console window
  397. void _print( const char* text );
  398. };
  399. #endif