AudioIO.cpp 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. //
  2. // libtgvoip is free and unencumbered public domain software.
  3. // For more information, see http://unlicense.org or the UNLICENSE file
  4. // you should have received with this source code distribution.
  5. //
  6. #include "AudioIO.h"
  7. #include "../logging.h"
  8. #ifdef HAVE_CONFIG_H
  9. #include "config.h"
  10. #endif
  11. #if defined(TGVOIP_USE_CALLBACK_AUDIO_IO)
  12. #include "AudioIOCallback.h"
  13. #elif defined(__ANDROID__)
  14. #include "../os/android/AudioInputAndroid.h"
  15. #include "../os/android/AudioOutputAndroid.h"
  16. #elif defined(__APPLE__)
  17. #include <TargetConditionals.h>
  18. #include "../os/darwin/AudioUnitIO.h"
  19. #if TARGET_OS_OSX
  20. #include "../os/darwin/AudioInputAudioUnitOSX.h"
  21. #include "../os/darwin/AudioOutputAudioUnitOSX.h"
  22. #endif
  23. #elif defined(_WIN32)
  24. #ifdef TGVOIP_WINXP_COMPAT
  25. #include "../os/windows/AudioInputWave.h"
  26. #include "../os/windows/AudioOutputWave.h"
  27. #endif
  28. #include "../os/windows/AudioInputWASAPI.h"
  29. #include "../os/windows/AudioOutputWASAPI.h"
  30. #elif defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__gnu_hurd__)
  31. #ifndef WITHOUT_ALSA
  32. #include "../os/linux/AudioInputALSA.h"
  33. #include "../os/linux/AudioOutputALSA.h"
  34. #endif
  35. #ifndef WITHOUT_PULSE
  36. #include "../os/linux/AudioPulse.h"
  37. #endif
  38. #else
  39. #error "Unsupported operating system"
  40. #endif
  41. using namespace tgvoip;
  42. using namespace tgvoip::audio;
  43. using namespace std;
  44. AudioIO* AudioIO::Create(std::string inputDevice, std::string outputDevice){
  45. #if defined(TGVOIP_USE_CALLBACK_AUDIO_IO)
  46. return new AudioIOCallback();
  47. #elif defined(__ANDROID__)
  48. return new ContextlessAudioIO<AudioInputAndroid, AudioOutputAndroid>();
  49. #elif defined(__APPLE__)
  50. #if TARGET_OS_OSX
  51. if(kCFCoreFoundationVersionNumber<kCFCoreFoundationVersionNumber10_7)
  52. return new ContextlessAudioIO<AudioInputAudioUnitLegacy, AudioOutputAudioUnitLegacy>(inputDevice, outputDevice);
  53. #endif
  54. return new AudioUnitIO(inputDevice, outputDevice);
  55. #elif defined(_WIN32)
  56. #ifdef TGVOIP_WINXP_COMPAT
  57. if(LOBYTE(LOWORD(GetVersion()))<6)
  58. return new ContextlessAudioIO<AudioInputWave, AudioOutputWave>(inputDevice, outputDevice);
  59. #endif
  60. return new ContextlessAudioIO<AudioInputWASAPI, AudioOutputWASAPI>(inputDevice, outputDevice);
  61. #elif defined(__linux__) || defined(__FreeBSD__) || defined(__OpenBSD__)
  62. #ifndef WITHOUT_ALSA
  63. #ifndef WITHOUT_PULSE
  64. if(AudioPulse::Load()){
  65. AudioIO* io=new AudioPulse(inputDevice, outputDevice);
  66. if(!io->Failed() && io->GetInput()->IsInitialized() && io->GetOutput()->IsInitialized())
  67. return io;
  68. LOGW("PulseAudio available but not working; trying ALSA");
  69. delete io;
  70. }
  71. #endif
  72. return new ContextlessAudioIO<AudioInputALSA, AudioOutputALSA>(inputDevice, outputDevice);
  73. #else
  74. return new AudioPulse(inputDevice, outputDevice);
  75. #endif
  76. #endif
  77. }
  78. bool AudioIO::Failed(){
  79. return failed;
  80. }
  81. std::string AudioIO::GetErrorDescription(){
  82. return error;
  83. }