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.

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. }