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.

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