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

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