rtaudiodriver.cpp 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. #include "rtaudiodriver.h"
  2. extern "C" {
  3. //Ron: added int api as param
  4. IMaxModAudioDriver* CreateAudioDriver_RtAudio( int api, int showWarnings ) {return new RtAudioDriver(api, showWarnings);}
  5. //Ron: added showWarnings
  6. void RtAudio_showWarnings(IMaxModAudioDriver* Driver, int onoff) {return static_cast<RtAudioDriver*>(Driver)->audio->showWarnings(onoff);}
  7. void CloseAudioDriver_RtAudio(IMaxModAudioDriver* Driver) {delete static_cast<RtAudioDriver*>(Driver);}
  8. }
  9. int RtCallback( void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames,double streamTime, RtAudioStreamStatus status, void *data ) {
  10. MaxMod_ProcessChannels(outputBuffer,nBufferFrames);
  11. return 0;
  12. }
  13. // ______________________________________________________________________________________________________________
  14. //Ron: added int api and int showWarnings so warnings could be disabled
  15. // before initialization
  16. RtAudioDriver::RtAudioDriver(int api, int showWarnings){
  17. //std::cout<<"api:"<<api<<endl;
  18. //create new audio object with correct api
  19. RtAudioDriver::SetAPI(api);
  20. audio->showWarnings(showWarnings);
  21. mmPrint("RtAudioDriver::RtAudioDriver");
  22. Terminate = 0;
  23. Active = 0;
  24. //unsigned int devices = dac.getDeviceCount();
  25. unsigned int devices = audio->getDeviceCount();
  26. if ( devices<1 ) {mmPrint("No audio output device found!"); return;}
  27. else {mmPrint("Audio drivers found=",(int)devices);}
  28. //parameters.deviceId = dac.getDefaultOutputDevice();
  29. parameters.deviceId = audio->getDefaultOutputDevice();
  30. parameters.nChannels = 2;
  31. parameters.firstChannel = 0;
  32. bufferFrames = 1024;
  33. }
  34. RtAudioDriver::~RtAudioDriver(){
  35. mmPrint("~RtAudioStream");
  36. if (!Terminate) Shutdown();
  37. }
  38. //Ron: make used API configurable
  39. int RtAudioDriver::SetAPI( int api) {
  40. //std::cout<<"SetAPI:"<<api;
  41. switch(api) {
  42. case 1: audio = new RtAudio(RtAudio::LINUX_ALSA);break;
  43. case 2: audio = new RtAudio(RtAudio::LINUX_PULSE);break;
  44. case 3: audio = new RtAudio(RtAudio::LINUX_OSS);break;
  45. case 4: audio = new RtAudio(RtAudio::UNIX_JACK);break;
  46. case 5: audio = new RtAudio(RtAudio::MACOSX_CORE);break;
  47. case 6: audio = new RtAudio(RtAudio::WINDOWS_ASIO);break;
  48. case 7: audio = new RtAudio(RtAudio::WINDOWS_DS);break;
  49. default: audio = new RtAudio(RtAudio::UNSPECIFIED);break;
  50. }
  51. return 1;
  52. }
  53. int RtAudioDriver::Startup(){
  54. if (Active==1) return 1;
  55. mmPrint("RtAudioDriver::Startup");
  56. options.flags = RTAUDIO_SCHEDULE_REALTIME;
  57. options.numberOfBuffers = 3;
  58. options.priority = 1;
  59. //Ron: wrap try-catch around so "false" can get returned
  60. try {
  61. audio->openStream( &parameters, NULL, RTAUDIO_FLOAT32, 44100, &bufferFrames, &RtCallback, this, &options );
  62. audio->startStream();
  63. }
  64. catch( RtError& e ) {
  65. //e.printMessage();
  66. return 0;
  67. }
  68. Active=1;
  69. return 1;
  70. }
  71. int RtAudioDriver::Shutdown(){
  72. mmPrint("RtAudioDriver::Shutdown");
  73. Terminate=1;
  74. audio->closeStream();
  75. return 1;
  76. }
  77. IMaxModSound* RtAudioDriver::CreateSound( int samplerate, int channels, int bits, int flags, void* data, int size ){
  78. }