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.

kcMain.cpp 6.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. #include <FL/Fl.H>
  2. #include <FL/Fl_Double_Window.H>
  3. #include <FL/Fl_Menu_Item.H>
  4. #include <Fl/Fl_Menu_Bar.H>
  5. #include <Fl/Fl_Button.H>
  6. #include <Fl/Fl_Text_Buffer.H>
  7. #include <Fl/Fl_Text_Display.H>
  8. #include <Fl/Fl_Tabs.H>
  9. #include <Fl/Fl_File_Chooser.H>
  10. #include "Fl_Splitter.h"
  11. #include "cmGlobal.h"
  12. #include "cmFloatTypes.h"
  13. #include "cmRpt.h"
  14. #include "cmErr.h"
  15. #include "cmCtx.h"
  16. #include "cmMem.h"
  17. #include "cmMallocDebug.h"
  18. #include "cmLinkedHeap.h"
  19. #include "cmJson.h"
  20. #include "cmThread.h"
  21. #include "cmText.h"
  22. #include "cmFileSys.h"
  23. #include "cmPrefs.h"
  24. #include "cmSymTbl.h"
  25. #include "cmDspValue.h"
  26. #include "cmMsgProtocol.h"
  27. #include "cmAudDspIF.h"
  28. #include "cmAudDspLocal.h"
  29. #include "cmAudioFile.h"
  30. #include "cmAudioFileMgr.h"
  31. #include "cmTime.h"
  32. #include "cmMidi.h"
  33. #include "cmMidiFile.h"
  34. #include "cmTimeLine.h"
  35. #include "cmScore.h"
  36. #include "cmdIf.h"
  37. #include "tlCtl.h"
  38. #include "kcApp.h"
  39. enum
  40. {
  41. kAppWndW = 1600,
  42. kAppWndH = 750,
  43. kAppWndX = 10,
  44. kAppWndY = 10
  45. };
  46. kcApp* kcAppPtr = NULL;
  47. void print( void*, const cmChar_t* text)
  48. { puts(text); }
  49. cmRC_t print_queue_cb(void* userCbPtr, unsigned msgByteCnt, const void* msgDataPtr )
  50. {
  51. print(NULL,(const char*)msgDataPtr);
  52. return cmOkRC;
  53. }
  54. cmRC_t handleSsInitMsg( void* cbDataPtr, const cmAudioSysSsInitMsg_t* r, const char* iDevLabel, const char* oDevLabel )
  55. { kcAppPtr->_handleSsInitMsg(r,iDevLabel,oDevLabel); return cmOkRC; }
  56. cmRC_t handleStatusMsg( void* cbDataPtr, const cmAudioSysStatus_t* r, const double* iMeterArray, const double* oMeterArray )
  57. { kcAppPtr->_handleStatusMsg(r,iMeterArray,oMeterArray); return cmOkRC;}
  58. cmRC_t handleUiMsg( void* cbDataPtr, const cmDspUiHdr_t* r )
  59. { kcAppPtr->_handleUiMsg(r); return cmOkRC;}
  60. cmPrRC_t kcInitPrefs( cmCtx_t* ctx, cmPrH_t* prH )
  61. {
  62. cmPrRC_t rc = kOkPrRC;
  63. if((rc = cmPrefsInit(ctx, prH, NULL, NULL, NULL, NULL, NULL )) != kOkPrRC )
  64. return rc;
  65. unsigned flags = 0;
  66. cmPrefsCreateInt(*prH, 1, "appWndW", flags, kAppWndW );
  67. cmPrefsCreateInt(*prH, 2, "appWndH", flags, kAppWndH );
  68. cmPrefsCreateInt(*prH, 3, "appWndX", flags, kAppWndX );
  69. cmPrefsCreateInt(*prH, 4, "appWndY", flags, kAppWndY );
  70. return cmPrefsRC(*prH);
  71. }
  72. int main( int argc, char* argv[] )
  73. {
  74. cmCtx_t ctx;
  75. cmTsMp1cH_t printqH = cmTsMp1cNullHandle;
  76. const char* appPrefDir = "kc";
  77. const char* appTitle = "KC Console";
  78. bool memDebugFl = false; //cmDEBUG_FL;
  79. unsigned memPadByteCnt = memDebugFl ? 8 : 0;
  80. unsigned memAlignByteCnt = 16;
  81. unsigned memFlags = memDebugFl ? (kTrackMmFl | kDeferFreeMmFl | kFillUninitMmFl) : 0;
  82. cmAdlH_t adlH = cmAdlNullHandle;
  83. cmAiH_t aiH = cmAiNullHandle;
  84. cmPrH_t prH = cmPrNullHandle;
  85. cmAdIfDispatch_t r;
  86. cmCtxSetup(&ctx,appTitle,print,print,NULL,memPadByteCnt,memAlignByteCnt,memFlags);
  87. // initialize the memory mgr
  88. if(cmMdInitialize( memPadByteCnt, memAlignByteCnt, memFlags, &ctx.rpt ) != kOkMmRC )
  89. {
  90. cmErrMsg(&ctx.err,kMemFailKmRC,"Heap initialization failed.");
  91. goto errLabel;
  92. }
  93. // initialize the file system
  94. if( cmFsInitialize( &ctx, appPrefDir ) != kOkFsRC )
  95. cmErrMsg(&ctx.err,kFileSysFailKmRC,"File system initialization failed.");
  96. // initialize the text system
  97. if( cmTsInitialize(&ctx) != kOkTxRC )
  98. cmErrMsg(&ctx.err,kTextSysFailKmRC,"Text system initialization failed.");
  99. // iniitalize the preferences
  100. if( kcInitPrefs(&ctx,&prH) != kOkPrRC )
  101. cmErrMsg(&ctx.err,kPrefsFailKmRC,"Preference initializatkion failed.");
  102. // create the print queue
  103. if( cmTsMp1cCreate( &printqH, 8192, print_queue_cb, NULL, NULL ) != kOkThRC )
  104. cmErrMsg(&ctx.err,kQueueFailKmRC,"Print queue creation failed.");
  105. r.cbDataPtr = NULL;
  106. r.ssInitFunc = handleSsInitMsg;
  107. r.statusFunc = handleStatusMsg;
  108. r.uiFunc = handleUiMsg;
  109. // initialize the audio engine
  110. if( cmAudDspLocalAllocate(&ctx,&adlH,&r) != kOkAdlRC )
  111. cmErrMsg(&ctx.err,kEngFailKmRC,"The audio DSP local server allocation failed.");
  112. else
  113. if(cmAdIfIsValid(aiH = cmAudDspLocalIF_Handle(adlH)) == false )
  114. cmErrMsg(&ctx.err,kEngFailKmRC,"The audio DSP interface handle is not valid.");
  115. if( cmErrLastRC(&ctx.err) == kOkKmRC )
  116. {
  117. int appWndW = cmPrefsIntDef(prH,"appWndW", kAppWndW);
  118. int appWndH = cmPrefsIntDef(prH,"appWndH", kAppWndH);
  119. int appWndX = cmPrefsIntDef(prH,"appWndX", kAppWndX);
  120. int appWndY = cmPrefsIntDef(prH,"appWndY", kAppWndY);
  121. kcAppPtr = new kcApp(&ctx, prH, printqH, appWndW, appWndH, appTitle, aiH, argc, argv);
  122. kcAppPtr->resize(appWndX,appWndY,appWndW,appWndH);
  123. cmAudDspLocalSendSetup(adlH);
  124. Fl::run();
  125. delete kcAppPtr;
  126. kcAppPtr=NULL;
  127. // reset the pgm context and print queue console output to stdout
  128. cmRptSetup(&ctx.rpt,print,print,NULL);
  129. cmTsMp1cSetCbFunc(printqH, print_queue_cb, NULL );
  130. }
  131. // empty any pending text to stdout
  132. while( cmTsMp1cMsgWaiting(printqH) )
  133. if( cmTsMp1cDequeueMsg(printqH, NULL, 0) != kOkThRC )
  134. cmErrMsg(&ctx.err,kQueueFailKmRC,"Print dequeue failed.");
  135. // release the engine
  136. if( cmAudDspLocalFree(&adlH) != kOkAdlRC )
  137. cmErrMsg(&ctx.err,kEngFailKmRC,"Audio DSP release failed.");
  138. // destroy the print queue
  139. if( cmTsMp1cDestroy(&printqH) != kOkThRC )
  140. cmErrMsg(&ctx.err,kQueueFailKmRC,"Print queue destroy failed.");
  141. // write the preferences file
  142. if( cmPrefsIsDirty(prH) )
  143. if( cmPrefsWrite(prH,cmPrefsFileName(prH)) != kOkPrRC )
  144. cmErrMsg(&ctx.err,kPrefsFailKmRC,"Preferences save failed.");
  145. // finalize the preferences file
  146. if( cmPrefsFinalize(&prH) != kOkPrRC )
  147. cmErrMsg(&ctx.err,kPrefsFailKmRC,"Preference finalize failed.");
  148. // finalize the text system
  149. if( cmTsFinalize() != kOkTxRC )
  150. cmErrMsg(&ctx.err,kTextSysFailKmRC,"Text system finalization failed.");
  151. // finalize the file system
  152. if( cmFsFinalize() != kOkFsRC )
  153. cmErrMsg(&ctx.err,kFileSysFailKmRC,"File system finalize failed.");
  154. // report memory mgr errors
  155. if( cmMdIsValid() )
  156. cmMdReport( kIgnoreNormalMmFl );
  157. // finalize the memory manager
  158. if( cmMdFinalize() != kOkMmRC )
  159. cmErrMsg(&ctx.err,kMemFailKmRC,"Heap finalization failed.");
  160. errLabel:
  161. return 0;
  162. }