Programmable real-time audio signal processing application
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

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