From 935fb96d2e241f45211846d65a3fc6e32c36c468 Mon Sep 17 00:00:00 2001 From: Florent Berthaut <florent.berthaut@univ-lille.fr> Date: Thu, 21 Jul 2022 00:29:52 +0200 Subject: [PATCH] Fixed linux version --- .gitattributes | 1 + .gitignore | 1 + GdpdExample/Main.tscn | 97 +++-- GdpdExample/icon.png.import | 1 + GdpdExample/patch1.pd | Bin 665 -> 849 bytes GdpdExample/patch2.pd | Bin 549 -> 773 bytes GdpdExample/project.godot | 1 - README.md | 7 +- SConstruct | 10 +- src/gdpd.hpp | 1 + src/rtaudio/RtAudio.cpp | 833 +++++++++++++++++++++++++----------- src/rtaudio/RtAudio.h | 270 ++++++------ src/rtaudio/RtAudio.os | Bin 114943 -> 77320 bytes 13 files changed, 801 insertions(+), 421 deletions(-) create mode 100755 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100755 index 0000000..77510b2 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.pd binary diff --git a/.gitignore b/.gitignore index ae3c406..71d246e 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ *.o *.so *.os +*.import diff --git a/GdpdExample/Main.tscn b/GdpdExample/Main.tscn index 9c9c91d..8899168 100644 --- a/GdpdExample/Main.tscn +++ b/GdpdExample/Main.tscn @@ -3,19 +3,15 @@ [sub_resource type="GDScript" id=1] script/source = "extends Control -var _gdpd - -var _patch = 0 +onready var _gdpd = load(\"res://addons/gdpd/bin/gdpd.gdns\").new() func _ready(): - _gdpd = load(\"res://addons/gdpd/bin/gdpd.gdns\").new() pass func _process(delta): while _gdpd.has_message() : - print(\"got msg\") var msg = _gdpd.get_next() - print(msg) + print(\"got message from pd \", msg) func _load_patch(pd_patch) : #separate file name from directory @@ -26,27 +22,44 @@ func _load_patch(pd_patch) : _gdpd.openfile(patch_name, patch_dir) func _on_Start_pressed() : + #retrieve the list of available input and outputs var inps = _gdpd.get_available_input_devices() var outs = _gdpd.get_available_output_devices() + + #initialise the first ones _gdpd.init_devices(inps[0], outs[0]) #the patch path should be the absolute one _load_patch(ProjectSettings.globalize_path(\"res://patch1.pd\")) _load_patch(ProjectSettings.globalize_path(\"res://patch2.pd\")) + #send message to [receive from_godot] with one symbol _gdpd.start_message(1) - _gdpd.add_symbol(\"from godot\") - _gdpd.finish_list(\"blup\") - - _gdpd.subscribe(\"toBfWeb\") + _gdpd.add_symbol(\"hello\") + _gdpd.finish_list(\"from_godot\") -func _on_Stop_pressed(): + #listen to messages sent with [send to_godot] + _gdpd.subscribe(\"to_godot\") +func _on_Stop_pressed(): _gdpd.closefile(\"patch1.pd\") _gdpd.closefile(\"patch2.pd\") _gdpd.stop() +func _on_HSlider_value_changed(value): + #send message to [receive from_godot] with three elements + _gdpd.start_message(3) + _gdpd.add_symbol(\"patch1\") + _gdpd.add_symbol(\"pitch\") + _gdpd.add_float(value) + _gdpd.finish_list(\"from_godot\") +func _on_HSlider2_value_changed(value): + _gdpd.start_message(3) + _gdpd.add_symbol(\"patch2\") + _gdpd.add_symbol(\"pitch\") + _gdpd.add_float(value) + _gdpd.finish_list(\"from_godot\") " [node name="Control" type="Control"] @@ -58,28 +71,60 @@ __meta__ = { } [node name="Stop" type="Button" parent="."] -margin_left = 73.0 -margin_top = 198.0 -margin_right = 176.0 -margin_bottom = 244.0 +margin_left = 213.0 +margin_top = 83.0 +margin_right = 316.0 +margin_bottom = 129.0 text = "Stop" __meta__ = { "_edit_use_anchors_": false } [node name="Start" type="Button" parent="."] -margin_left = 83.0 -margin_top = 93.0 -margin_right = 187.0 -margin_bottom = 144.0 +margin_left = 73.0 +margin_top = 83.0 +margin_right = 177.0 +margin_bottom = 134.0 text = "Start" -[node name="Load" type="Button" parent="."] -margin_left = 103.0 -margin_top = 159.0 -margin_right = 145.0 -margin_bottom = 179.0 -text = "Load" +[node name="HSlider" type="HSlider" parent="."] +margin_left = 73.0 +margin_top = 193.0 +margin_right = 406.0 +margin_bottom = 209.0 +max_value = 12.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Label" type="Label" parent="."] +margin_left = 73.0 +margin_top = 170.0 +margin_right = 113.0 +margin_bottom = 184.0 +text = "Send pitch to patch1" + +[node name="HSlider2" type="HSlider" parent="."] +margin_left = 73.0 +margin_top = 275.0 +margin_right = 406.0 +margin_bottom = 291.0 +max_value = 12.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="Label2" type="Label" parent="."] +margin_left = 73.0 +margin_top = 246.0 +margin_right = 204.0 +margin_bottom = 260.0 +text = "Send pitch to patch2" +__meta__ = { +"_edit_use_anchors_": false +} + [connection signal="pressed" from="Stop" to="." method="_on_Stop_pressed"] [connection signal="pressed" from="Start" to="." method="_on_Start_pressed"] -[connection signal="pressed" from="Load" to="." method="_on_Load_pressed"] +[connection signal="value_changed" from="HSlider" to="." method="_on_HSlider_value_changed"] +[connection signal="value_changed" from="HSlider2" to="." method="_on_HSlider2_value_changed"] diff --git a/GdpdExample/icon.png.import b/GdpdExample/icon.png.import index 96cbf46..a4c02e6 100644 --- a/GdpdExample/icon.png.import +++ b/GdpdExample/icon.png.import @@ -28,6 +28,7 @@ process/fix_alpha_border=true process/premult_alpha=false process/HDR_as_SRGB=false process/invert_color=false +process/normal_map_invert_y=false stream=false size_limit=0 detect_3d=true diff --git a/GdpdExample/patch1.pd b/GdpdExample/patch1.pd index 3c3f092e53e168b62056dfd4cffeee438ef2843c..295f29d7515db9dca6c5e2786ea944188d612441 100644 GIT binary patch literal 849 zcmY%PQ%FwCD@!a^Fi<cyRIoHPQ!p_zRWLNN=2DJO$WO{rFflh)Ff=h%C{`#)K@qex zQpm|qOi4=2O9zYR7N<iL8=5Jk6c;EMf<-|_7#Wx=7#o-?q$DQSp$HmT7%OPiDH!M> zsWn$Hw?s7<Y=pUjp@FeNZfZ$UzJj5FfdRrCa|J_FV}+c|;u3|#f`ZgMgeyVznp-Lq zDWnzU=f<b!r{tHQXfrogC{`%RN0%`$S1>d-RVd0YElE`<NGwUtKysdexq^|AsX}f^ zej36okPZVAs1A@zP^HWapi%{yCCM3JIZ$93nJX9?SwL-2$Vkn}$yWqRmZVmcC>WY3 zm>MV)r{<+7<faxEC#I(=l;kTQJONf@WMHabVxdr!nw*+hmI_x0@-LE7Z~%fFZeXC0 zT2WA>pps^&ZDI<x3od7BsgPfsT&G}Y2npNd{Jgx><Prr#1p@^m1ynI31p^QS8vs*h z0!l$>>L6l}(1WQnRWML6LsMs_U;y$jswL(M1`3vF3N1hi(OqK*a*Uxdno>iM!woIa jML|vnX+Uv1NV9^WIl5Yq^DzWL&H|Z@Y5>S#CLsL)wg=%$ literal 665 zcmY%PQ%FwCD@!a^Fj6owvrsTMwoouOHc&7$vgT5bP{>cpQZP0#QLr#lC{`#)K@l@H zRLIFsOi4=2O9zYR7N>*Nnwl!46c;EMf(1ba7@8U>7#f=>q$DQSp$J--DdZO?*D08o z7@&w78X72Q)hQV0A<Qr`F;K8Xvk+vqk%^&#p^2eFZfZ$UzJj5F0mLMbTR>V2%`6lO z5=)XZ3>6>}AU&pLCJKg@h6)8mnRz8pX}J9+mWB#O<_bj$Njaqja8XkOGm!OIbr>02 zDj1oXDikY}<U6H>rzRnEnOZ6snph|lVaR~pW@)UDlUZD%kXTTVnuiEmkPA!=6-pG6 z6d*<==jY|6CYLA}Di|mjLHz*}Gg2@BL9mrDF%ty?1yeM2rV0iM##qH5VGPr2reL68 zj;79B!9c+RP0T{UK*7)iP0$eJ7DIHa4UH8H6fDt|f*fgx?i)i>1w#cxa9jZZ{xGU@ diff --git a/GdpdExample/patch2.pd b/GdpdExample/patch2.pd index 099314ff1570d8d522778c1d39ceece6d758e04f..e4495276a278f03fd8fe1962354f243a9d8667e1 100644 GIT binary patch literal 773 zcmY%PQ%FwCD@!a^Ff=w(Ff}$*urxJOFflV#Ff_8}QjSo_Ps&m-HZoQ)G&5HyRwzh8 z6*M$c$jMJkNlMI12TSA@r$bbm7$~F^7bqBlML}j58k;B>8(Ju&BqrCP2pU<MC}`Cw z80aC?8ks6sq8SV_!U*IjV};z*lA?SCLjwZ?xH%vhb5n(!%;FM-#Dap<JcKhr_8J-( zDikTC73Jr~r{|~SmmupiGB8vqRw&6wlL2WnGPYF6Ey+)VD+dW0np!Fp<(HPEDikD^ zBxgVZ3FK{%8%zzLq6!(QIXU^L8ZAs<8Z%3hGf?G>%%E~0FQ7;n8JZ}hRumK|sH7Qc zn^>UAnHwnN7bn*#7@9)DA~`=VFEzPD!BD|K!AJpB%t*li1i=Qt)R`z4C>W!ugNQ*Q z1E$VY!9c+bO`Vy7fr25rCFTkS3YKUJEkFuQ&;$)Zjxj_x(-7ovLv$B`Y*8>rH^3NV btSP!E$n_voP`qgfazDsMR8f!*!0rM7JNw8( literal 549 zcmY%PQ%FwCD@!a^Fj6o!vQRKFHBc}%Fi<cwvgT5bP{>cpQZP0#QLr#lC{`#)K@l@H zRLIFsOi4=2O9zYR7N>*Nnwl!46c;EMf(1ba7@8U>7#f=>q$DQSp$ZxrC}`Cw80ev@ zwJ=l2FHWvgFf%ZKD>pJRP%tz^vk_#tk%^&#p^2eFZfZ$UzJj3vR1e58U_E9Q3I&NJ z$r(lpNQN03C>R-ADikY}<U6H>rzRm;W3FIiV6KppSzMx!SWu9fhw!tJiGrb-nL-g3 zO$vsV1_}j5nRz8p%fJRE=jY|6CYLA}Di|ohtcQsiDHwntiaHYo0|jHKGhyl=Vvz8G uiJ2-GD43wBGgB~7Fh>(JS1?epKohf2Fi<cwKobNBC|IHkf}Cv#b~gYdjf_?R diff --git a/GdpdExample/project.godot b/GdpdExample/project.godot index efa5313..1daf325 100644 --- a/GdpdExample/project.godot +++ b/GdpdExample/project.godot @@ -10,7 +10,6 @@ config_version=4 _global_script_classes=[ ] _global_script_class_icons={ - } [application] diff --git a/README.md b/README.md index 09b6664..a9ec809 100644 --- a/README.md +++ b/README.md @@ -7,8 +7,9 @@ Godot add-on for loading and processing Pure Data patches ## Compiling on GNU/Linux -- Open a terminal -- Type the following commandes : +- Install the following packages : + - scons +- Open a terminal and type the following commands : - git clone https://gitlab.univ-lille.fr/ivmi/gdpd.git - cd gdpd - ./update.sh linux @@ -16,7 +17,7 @@ Godot add-on for loading and processing Pure Data patches ## Compiling on Windows - Open the Windows Powershell -- Type the following commandes : +- Type the following commands : - git clone https://gitlab.univ-lille.fr/ivmi/gdpd.git - cd gdpd - ./update.sh windows diff --git a/SConstruct b/SConstruct index a7fdfe2..a7076dd 100644 --- a/SConstruct +++ b/SConstruct @@ -4,7 +4,7 @@ import os, subprocess opts = Variables([], ARGUMENTS) # Gets the standard flags CC, CCX, etc. -env = DefaultEnvironment() +env = Environment(ENV = os.environ) # Define our options opts.Add(EnumVariable('target', "Compilation target", 'release', ['d', 'debug', 'r', 'release'])) @@ -61,12 +61,13 @@ if env['platform'] == "osx": env.Append(CCFLAGS=['-g', '-O3', '-arch', 'x86_64']) elif env['platform'] in ('x11', 'linux'): - env['CC'] = 'gcc-7' - env['CXX'] = 'g++-7' + env['CC'] = 'gcc' + env['CXX'] = 'g++' env['target_path'] += 'x11/' cpp_library += '.linux' env.Append(CPPDEFINES=['__UNIX_JACK__', 'LIBPD_EXTRA']) - env.Append(LINKFLAGS=['-ljack','-pthread']) + env.Append(LIBS=['jack', 'pthread']) + env.Append(LDPATH=['/usr/lib/x86_64-linux-gnu']) if env['target'] in ('debug', 'd'): env.Append(CCFLAGS=['-fPIC', '-g3', '-Og']) env.Append(CFLAGS=['-std=c11']) @@ -80,6 +81,7 @@ elif env['platform'] == "windows": env['target_path'] += 'win64/' cpp_library += '.windows' env.Append(ENV=os.environ) + env.Append(CPPDEFINES=['NOMINMAX']) if not env['use_mingw']: # MSVC diff --git a/src/gdpd.hpp b/src/gdpd.hpp index 3bf3ea1..9069ffe 100644 --- a/src/gdpd.hpp +++ b/src/gdpd.hpp @@ -5,6 +5,7 @@ #include <stdlib.h> #include <string.h> #include <map> +#include <algorithm> #include <Godot.hpp> #include <AudioStreamPlayer.hpp> diff --git a/src/rtaudio/RtAudio.cpp b/src/rtaudio/RtAudio.cpp index 0837d98..40fb6a9 100644 --- a/src/rtaudio/RtAudio.cpp +++ b/src/rtaudio/RtAudio.cpp @@ -11,7 +11,7 @@ RtAudio WWW site: http://www.music.mcgill.ca/~gary/rtaudio/ RtAudio: realtime audio i/o C++ classes - Copyright (c) 2001-2019 Gary P. Scavone + Copyright (c) 2001-2021 Gary P. Scavone Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files @@ -39,7 +39,7 @@ */ /************************************************************************/ -// RtAudio: Version 5.1.0 +// RtAudio: Version 5.2.0 #include "RtAudio.h" #include <iostream> @@ -56,7 +56,7 @@ const unsigned int RtApi::SAMPLE_RATES[] = { 32000, 44100, 48000, 88200, 96000, 176400, 192000 }; -#if defined(__WINDOWS_DS__) || defined(__WINDOWS_ASIO__) || defined(__WINDOWS_WASAPI__) +#if defined(_WIN32) || defined(__CYGWIN__) #define MUTEX_INITIALIZE(A) InitializeCriticalSection(A) #define MUTEX_DESTROY(A) DeleteCriticalSection(A) #define MUTEX_LOCK(A) EnterCriticalSection(A) @@ -64,12 +64,17 @@ const unsigned int RtApi::SAMPLE_RATES[] = { #include "tchar.h" - static std::string convertCharPointerToStdString(const char *text) + template<typename T> inline + std::string convertCharPointerToStdString(const T *text); + + template<> inline + std::string convertCharPointerToStdString(const char *text) { return std::string(text); } - static std::string convertCharPointerToStdString(const wchar_t *text) + template<> inline + std::string convertCharPointerToStdString(const wchar_t *text) { int length = WideCharToMultiByte(CP_UTF8, 0, text, -1, NULL, 0, NULL, NULL); std::string s( length-1, '\0' ); @@ -77,15 +82,12 @@ const unsigned int RtApi::SAMPLE_RATES[] = { return s; } -#elif defined(__LINUX_ALSA__) || defined(__LINUX_PULSE__) || defined(__UNIX_JACK__) || defined(__LINUX_OSS__) || defined(__MACOSX_CORE__) +#elif defined(__unix__) || defined(__APPLE__) // pthread API #define MUTEX_INITIALIZE(A) pthread_mutex_init(A, NULL) #define MUTEX_DESTROY(A) pthread_mutex_destroy(A) #define MUTEX_LOCK(A) pthread_mutex_lock(A) #define MUTEX_UNLOCK(A) pthread_mutex_unlock(A) -#else - #define MUTEX_INITIALIZE(A) abs(*A) // dummy definitions - #define MUTEX_DESTROY(A) abs(*A) // dummy definitions #endif // *************************************************** // @@ -262,7 +264,7 @@ RtAudio :: RtAudio( RtAudio::Api api ) // It should not be possible to get here because the preprocessor // definition __RTAUDIO_DUMMY__ is automatically defined if no // API-specific definitions are passed to the compiler. But just in - // case something weird happens, we'll thow an error. + // case something weird happens, we'll throw an error. std::string errorText = "\nRtAudio: no compiled API support found ... critical error!!\n\n"; throw( RtAudioError( errorText, RtAudioError::UNSPECIFIED ) ); } @@ -405,13 +407,27 @@ void RtApi :: openStream( RtAudio::StreamParameters *oParams, unsigned int RtApi :: getDefaultInputDevice( void ) { - // Should be implemented in subclasses if possible. + // Should be reimplemented in subclasses if necessary. + unsigned int nDevices = getDeviceCount(); + for ( unsigned int i = 0; i < nDevices; i++ ) { + if ( getDeviceInfo( i ).isDefaultInput ) { + return i; + } + } + return 0; } unsigned int RtApi :: getDefaultOutputDevice( void ) { - // Should be implemented in subclasses if possible. + // Should be reimplemented in subclasses if necessary. + unsigned int nDevices = getDeviceCount(); + for ( unsigned int i = 0; i < nDevices; i++ ) { + if ( getDeviceInfo( i ).isDefaultOutput ) { + return i; + } + } + return 0; } @@ -506,6 +522,8 @@ unsigned int RtApi :: getStreamSampleRate( void ) #if defined(__MACOSX_CORE__) +#include <unistd.h> + // The OS X CoreAudio API is designed to use a separate callback // procedure for each of its audio devices. A single RtAudio duplex // stream using two different devices is supported here, though it @@ -1478,15 +1496,17 @@ void RtApiCore :: closeStream( void ) errorText_ = "RtApiCore::closeStream(): error removing property listener!"; error( RtAudioError::WARNING ); } - } - if ( stream_.state == STREAM_RUNNING ) - AudioDeviceStop( handle->id[0], callbackHandler ); + #if defined( MAC_OS_X_VERSION_10_5 ) && ( MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 ) - AudioDeviceDestroyIOProcID( handle->id[0], handle->procId[0] ); -#else - // deprecated in favor of AudioDeviceDestroyIOProcID() - AudioDeviceRemoveIOProc( handle->id[0], callbackHandler ); + if ( stream_.state == STREAM_RUNNING ) + AudioDeviceStop( handle->id[0], handle->procId[0] ); + AudioDeviceDestroyIOProcID( handle->id[0], handle->procId[0] ); +#else // deprecated behaviour + if ( stream_.state == STREAM_RUNNING ) + AudioDeviceStop( handle->id[0], callbackHandler ); + AudioDeviceRemoveIOProc( handle->id[0], callbackHandler ); #endif + } } if ( stream_.mode == INPUT || ( stream_.mode == DUPLEX && stream_.device[0] != stream_.device[1] ) ) { @@ -1501,15 +1521,17 @@ void RtApiCore :: closeStream( void ) errorText_ = "RtApiCore::closeStream(): error removing property listener!"; error( RtAudioError::WARNING ); } - } - if ( stream_.state == STREAM_RUNNING ) - AudioDeviceStop( handle->id[1], callbackHandler ); + #if defined( MAC_OS_X_VERSION_10_5 ) && ( MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 ) - AudioDeviceDestroyIOProcID( handle->id[1], handle->procId[1] ); -#else - // deprecated in favor of AudioDeviceDestroyIOProcID() - AudioDeviceRemoveIOProc( handle->id[1], callbackHandler ); + if ( stream_.state == STREAM_RUNNING ) + AudioDeviceStop( handle->id[1], handle->procId[1] ); + AudioDeviceDestroyIOProcID( handle->id[1], handle->procId[1] ); +#else // deprecated behaviour + if ( stream_.state == STREAM_RUNNING ) + AudioDeviceStop( handle->id[1], callbackHandler ); + AudioDeviceRemoveIOProc( handle->id[1], callbackHandler ); #endif + } } for ( int i=0; i<2; i++ ) { @@ -1542,15 +1564,19 @@ void RtApiCore :: startStream( void ) return; } - #if defined( HAVE_GETTIMEOFDAY ) +#if defined( HAVE_GETTIMEOFDAY ) gettimeofday( &stream_.lastTickTimestamp, NULL ); - #endif +#endif OSStatus result = noErr; CoreHandle *handle = (CoreHandle *) stream_.apiHandle; if ( stream_.mode == OUTPUT || stream_.mode == DUPLEX ) { +#if defined( MAC_OS_X_VERSION_10_5 ) && ( MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 ) + result = AudioDeviceStart( handle->id[0], handle->procId[0] ); +#else // deprecated behaviour result = AudioDeviceStart( handle->id[0], callbackHandler ); +#endif if ( result != noErr ) { errorStream_ << "RtApiCore::startStream: system error (" << getErrorCode( result ) << ") starting callback procedure on device (" << stream_.device[0] << ")."; errorText_ = errorStream_.str(); @@ -1561,7 +1587,11 @@ void RtApiCore :: startStream( void ) if ( stream_.mode == INPUT || ( stream_.mode == DUPLEX && stream_.device[0] != stream_.device[1] ) ) { +#if defined( MAC_OS_X_VERSION_10_5 ) && ( MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 ) + result = AudioDeviceStart( handle->id[1], handle->procId[1] ); +#else // deprecated behaviour result = AudioDeviceStart( handle->id[1], callbackHandler ); +#endif if ( result != noErr ) { errorStream_ << "RtApiCore::startStream: system error starting input callback procedure on device (" << stream_.device[1] << ")."; errorText_ = errorStream_.str(); @@ -1596,7 +1626,11 @@ void RtApiCore :: stopStream( void ) pthread_cond_wait( &handle->condition, &stream_.mutex ); // block until signaled } +#if defined( MAC_OS_X_VERSION_10_5 ) && ( MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 ) + result = AudioDeviceStop( handle->id[0], handle->procId[0] ); +#else // deprecated behaviour result = AudioDeviceStop( handle->id[0], callbackHandler ); +#endif if ( result != noErr ) { errorStream_ << "RtApiCore::stopStream: system error (" << getErrorCode( result ) << ") stopping callback procedure on device (" << stream_.device[0] << ")."; errorText_ = errorStream_.str(); @@ -1606,7 +1640,11 @@ void RtApiCore :: stopStream( void ) if ( stream_.mode == INPUT || ( stream_.mode == DUPLEX && stream_.device[0] != stream_.device[1] ) ) { +#if defined( MAC_OS_X_VERSION_10_5 ) && ( MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 ) + result = AudioDeviceStop( handle->id[1], handle->procId[1] ); +#else // deprecated behaviour result = AudioDeviceStop( handle->id[1], callbackHandler ); +#endif if ( result != noErr ) { errorStream_ << "RtApiCore::stopStream: system error (" << getErrorCode( result ) << ") stopping input callback procedure on device (" << stream_.device[1] << ")."; errorText_ = errorStream_.str(); @@ -2790,13 +2828,13 @@ static long asioMessages( long selector, long value, void* message, double* opt RtApiAsio :: RtApiAsio() { - // ASIO cannot run on a multi-threaded appartment. You can call - // CoInitialize beforehand, but it must be for appartment threading + // ASIO cannot run on a multi-threaded apartment. You can call + // CoInitialize beforehand, but it must be for apartment threading // (in which case, CoInitilialize will return S_FALSE here). coInitialized_ = false; HRESULT hr = CoInitialize( NULL ); if ( FAILED(hr) ) { - errorText_ = "RtApiAsio::ASIO requires a single-threaded appartment. Call CoInitializeEx(0,COINIT_APARTMENTTHREADED)"; + errorText_ = "RtApiAsio::ASIO requires a single-threaded apartment. Call CoInitializeEx(0,COINIT_APARTMENTTHREADED)"; error( RtAudioError::WARNING ); } coInitialized_ = true; @@ -2819,6 +2857,18 @@ unsigned int RtApiAsio :: getDeviceCount( void ) return (unsigned int) drivers.asioGetNumDev(); } +// We can only load one ASIO driver, so the default output is always the first device. +unsigned int RtApiAsio :: getDefaultOutputDevice( void ) +{ + return 0; +} + +// We can only load one ASIO driver, so the default input is always the first device. +unsigned int RtApiAsio :: getDefaultInputDevice( void ) +{ + return 0; +} + RtAudio::DeviceInfo RtApiAsio :: getDeviceInfo( unsigned int device ) { RtAudio::DeviceInfo info; @@ -3799,6 +3849,17 @@ if ( objectPtr )\ typedef HANDLE ( __stdcall *TAvSetMmThreadCharacteristicsPtr )( LPCWSTR TaskName, LPDWORD TaskIndex ); +#ifndef __IAudioClient3_INTERFACE_DEFINED__ +MIDL_INTERFACE( "00000000-0000-0000-0000-000000000000" ) IAudioClient3 +{ + virtual HRESULT GetSharedModeEnginePeriod( WAVEFORMATEX*, UINT32*, UINT32*, UINT32*, UINT32* ) = 0; + virtual HRESULT InitializeSharedAudioStream( DWORD, UINT32, WAVEFORMATEX*, LPCGUID ) = 0; +}; +#ifdef __CRT_UUID_DECL +__CRT_UUID_DECL( IAudioClient3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) +#endif +#endif + //----------------------------------------------------------------------------- // WASAPI dictates stream sample rate, format, channel count, and in some cases, buffer size. @@ -4053,7 +4114,7 @@ public: #endif } - void Convert( char* outBuffer, const char* inBuffer, unsigned int inSampleCount, unsigned int& outSampleCount ) + void Convert( char* outBuffer, const char* inBuffer, unsigned int inSampleCount, unsigned int& outSampleCount, int maxOutSampleCount = -1 ) { unsigned int inputBufferSize = _bytesPerSample * _channelCount * inSampleCount; if ( _sampleRatio == 1 ) @@ -4064,7 +4125,15 @@ public: return; } - unsigned int outputBufferSize = ( unsigned int ) ceilf( inputBufferSize * _sampleRatio ) + ( _bytesPerSample * _channelCount ); + unsigned int outputBufferSize = 0; + if ( maxOutSampleCount != -1 ) + { + outputBufferSize = _bytesPerSample * _channelCount * maxOutSampleCount; + } + else + { + outputBufferSize = ( unsigned int ) ceilf( inputBufferSize * _sampleRatio ) + ( _bytesPerSample * _channelCount ); + } IMFMediaBuffer* rInBuffer; IMFSample* rInSample; @@ -4486,34 +4555,6 @@ Exit: return info; } -//----------------------------------------------------------------------------- - -unsigned int RtApiWasapi::getDefaultOutputDevice( void ) -{ - for ( unsigned int i = 0; i < getDeviceCount(); i++ ) { - if ( getDeviceInfo( i ).isDefaultOutput ) { - return i; - } - } - - return 0; -} - -//----------------------------------------------------------------------------- - -unsigned int RtApiWasapi::getDefaultInputDevice( void ) -{ - for ( unsigned int i = 0; i < getDeviceCount(); i++ ) { - if ( getDeviceInfo( i ).isDefaultInput ) { - return i; - } - } - - return 0; -} - -//----------------------------------------------------------------------------- - void RtApiWasapi::closeStream( void ) { if ( stream_.state == STREAM_CLOSED ) { @@ -4600,17 +4641,16 @@ void RtApiWasapi::stopStream( void ) error( RtAudioError::WARNING ); return; } + if ( stream_.state == STREAM_STOPPING ) { + errorText_ = "RtApiWasapi::stopStream: The stream is already stopping."; + error( RtAudioError::WARNING ); + return; + } // inform stream thread by setting stream state to STREAM_STOPPING stream_.state = STREAM_STOPPING; - // wait until stream thread is stopped - while( stream_.state != STREAM_STOPPED ) { - Sleep( 1 ); - } - - // Wait for the last buffer to play before stopping. - Sleep( 1000 * stream_.bufferSize / stream_.sampleRate ); + WaitForSingleObject( ( void* ) stream_.callbackInfo.thread, INFINITE ); // close thread handle if ( stream_.callbackInfo.thread && !CloseHandle( ( void* ) stream_.callbackInfo.thread ) ) { @@ -4633,14 +4673,16 @@ void RtApiWasapi::abortStream( void ) error( RtAudioError::WARNING ); return; } + if ( stream_.state == STREAM_STOPPING ) { + errorText_ = "RtApiWasapi::abortStream: The stream is already stopping."; + error( RtAudioError::WARNING ); + return; + } // inform stream thread by setting stream state to STREAM_STOPPING stream_.state = STREAM_STOPPING; - // wait until stream thread is stopped - while ( stream_.state != STREAM_STOPPED ) { - Sleep( 1 ); - } + WaitForSingleObject( ( void* ) stream_.callbackInfo.thread, INFINITE ); // close thread handle if ( stream_.callbackInfo.thread && !CloseHandle( ( void* ) stream_.callbackInfo.thread ) ) { @@ -4849,7 +4891,7 @@ bool RtApiWasapi::probeDeviceOpen( unsigned int device, StreamMode mode, unsigne stream_.doConvertBuffer[mode] = true; if ( stream_.doConvertBuffer[mode] ) - setConvertInfo( mode, 0 ); + setConvertInfo( mode, firstChannel ); // Allocate necessary internal buffers bufferBytes = stream_.nUserChannels[mode] * stream_.bufferSize * formatBytes( stream_.userFormat ); @@ -4941,7 +4983,7 @@ void RtApiWasapi::wasapiThread() // declare local stream variables RtAudioCallback callback = ( RtAudioCallback ) stream_.callbackInfo.callback; BYTE* streamBuffer = NULL; - unsigned long captureFlags = 0; + DWORD captureFlags = 0; unsigned int bufferFrameCount = 0; unsigned int numFramesPadding = 0; unsigned int convBufferSize = 0; @@ -4960,7 +5002,7 @@ void RtApiWasapi::wasapiThread() RtAudioError::Type errorType = RtAudioError::DRIVER_ERROR; // Attempt to assign "Pro Audio" characteristic to thread - HMODULE AvrtDll = LoadLibrary( (LPCTSTR) "AVRT.dll" ); + HMODULE AvrtDll = LoadLibraryW( L"AVRT.dll" ); if ( AvrtDll ) { DWORD taskIndex = 0; TAvSetMmThreadCharacteristicsPtr AvSetMmThreadCharacteristicsPtr = @@ -4985,12 +5027,37 @@ void RtApiWasapi::wasapiThread() captureSrRatio = ( ( float ) captureFormat->nSamplesPerSec / stream_.sampleRate ); if ( !captureClient ) { - hr = captureAudioClient->Initialize( AUDCLNT_SHAREMODE_SHARED, - loopbackEnabled ? AUDCLNT_STREAMFLAGS_LOOPBACK : AUDCLNT_STREAMFLAGS_EVENTCALLBACK, - 0, - 0, - captureFormat, - NULL ); + IAudioClient3* captureAudioClient3 = nullptr; + captureAudioClient->QueryInterface( __uuidof( IAudioClient3 ), ( void** ) &captureAudioClient3 ); + if ( captureAudioClient3 && !loopbackEnabled ) + { + UINT32 Ignore; + UINT32 MinPeriodInFrames; + hr = captureAudioClient3->GetSharedModeEnginePeriod( captureFormat, + &Ignore, + &Ignore, + &MinPeriodInFrames, + &Ignore ); + if ( FAILED( hr ) ) { + errorText = "RtApiWasapi::wasapiThread: Unable to initialize capture audio client."; + goto Exit; + } + + hr = captureAudioClient3->InitializeSharedAudioStream( AUDCLNT_STREAMFLAGS_EVENTCALLBACK, + MinPeriodInFrames, + captureFormat, + NULL ); + } + else + { + hr = captureAudioClient->Initialize( AUDCLNT_SHAREMODE_SHARED, + loopbackEnabled ? AUDCLNT_STREAMFLAGS_LOOPBACK : AUDCLNT_STREAMFLAGS_EVENTCALLBACK, + 0, + 0, + captureFormat, + NULL ); + } + if ( FAILED( hr ) ) { errorText = "RtApiWasapi::wasapiThread: Unable to initialize capture audio client."; goto Exit; @@ -5071,12 +5138,37 @@ void RtApiWasapi::wasapiThread() renderSrRatio = ( ( float ) renderFormat->nSamplesPerSec / stream_.sampleRate ); if ( !renderClient ) { - hr = renderAudioClient->Initialize( AUDCLNT_SHAREMODE_SHARED, - AUDCLNT_STREAMFLAGS_EVENTCALLBACK, - 0, - 0, - renderFormat, - NULL ); + IAudioClient3* renderAudioClient3 = nullptr; + renderAudioClient->QueryInterface( __uuidof( IAudioClient3 ), ( void** ) &renderAudioClient3 ); + if ( renderAudioClient3 ) + { + UINT32 Ignore; + UINT32 MinPeriodInFrames; + hr = renderAudioClient3->GetSharedModeEnginePeriod( renderFormat, + &Ignore, + &Ignore, + &MinPeriodInFrames, + &Ignore ); + if ( FAILED( hr ) ) { + errorText = "RtApiWasapi::wasapiThread: Unable to initialize render audio client."; + goto Exit; + } + + hr = renderAudioClient3->InitializeSharedAudioStream( AUDCLNT_STREAMFLAGS_EVENTCALLBACK, + MinPeriodInFrames, + renderFormat, + NULL ); + } + else + { + hr = renderAudioClient->Initialize( AUDCLNT_SHAREMODE_SHARED, + AUDCLNT_STREAMFLAGS_EVENTCALLBACK, + 0, + 0, + renderFormat, + NULL ); + } + if ( FAILED( hr ) ) { errorText = "RtApiWasapi::wasapiThread: Unable to initialize render audio client."; goto Exit; @@ -5140,18 +5232,18 @@ void RtApiWasapi::wasapiThread() if ( stream_.mode == INPUT ) { using namespace std; // for ceilf - convBuffSize = ( size_t ) ( ceilf( stream_.bufferSize * captureSrRatio ) ) * stream_.nDeviceChannels[INPUT] * formatBytes( stream_.deviceFormat[INPUT] ); + convBuffSize = ( unsigned int ) ( ceilf( stream_.bufferSize * captureSrRatio ) ) * stream_.nDeviceChannels[INPUT] * formatBytes( stream_.deviceFormat[INPUT] ); deviceBuffSize = stream_.bufferSize * stream_.nDeviceChannels[INPUT] * formatBytes( stream_.deviceFormat[INPUT] ); } else if ( stream_.mode == OUTPUT ) { - convBuffSize = ( size_t ) ( ceilf( stream_.bufferSize * renderSrRatio ) ) * stream_.nDeviceChannels[OUTPUT] * formatBytes( stream_.deviceFormat[OUTPUT] ); + convBuffSize = ( unsigned int ) ( ceilf( stream_.bufferSize * renderSrRatio ) ) * stream_.nDeviceChannels[OUTPUT] * formatBytes( stream_.deviceFormat[OUTPUT] ); deviceBuffSize = stream_.bufferSize * stream_.nDeviceChannels[OUTPUT] * formatBytes( stream_.deviceFormat[OUTPUT] ); } else if ( stream_.mode == DUPLEX ) { - convBuffSize = std::max( ( size_t ) ( ceilf( stream_.bufferSize * captureSrRatio ) ) * stream_.nDeviceChannels[INPUT] * formatBytes( stream_.deviceFormat[INPUT] ), - ( size_t ) ( ceilf( stream_.bufferSize * renderSrRatio ) ) * stream_.nDeviceChannels[OUTPUT] * formatBytes( stream_.deviceFormat[OUTPUT] ) ); + convBuffSize = std::max( ( unsigned int ) ( ceilf( stream_.bufferSize * captureSrRatio ) ) * stream_.nDeviceChannels[INPUT] * formatBytes( stream_.deviceFormat[INPUT] ), + ( unsigned int ) ( ceilf( stream_.bufferSize * renderSrRatio ) ) * stream_.nDeviceChannels[OUTPUT] * formatBytes( stream_.deviceFormat[OUTPUT] ) ); deviceBuffSize = std::max( stream_.bufferSize * stream_.nDeviceChannels[INPUT] * formatBytes( stream_.deviceFormat[INPUT] ), stream_.bufferSize * stream_.nDeviceChannels[OUTPUT] * formatBytes( stream_.deviceFormat[OUTPUT] ) ); } @@ -5177,11 +5269,6 @@ void RtApiWasapi::wasapiThread() if ( captureAudioClient ) { int samplesToPull = ( unsigned int ) floorf( stream_.bufferSize * captureSrRatio ); - if ( captureSrRatio != 1 ) - { - // account for remainders - samplesToPull--; - } convBufferSize = 0; while ( convBufferSize < stream_.bufferSize ) @@ -5203,7 +5290,8 @@ void RtApiWasapi::wasapiThread() captureResampler->Convert( stream_.deviceBuffer + deviceBufferOffset, convBuffer, samplesToPull, - convSamples ); + convSamples, + convBufferSize == 0 ? -1 : stream_.bufferSize - convBufferSize ); convBufferSize += convSamples; samplesToPull = 1; // now pull one sample at a time until we have stream_.bufferSize samples @@ -5471,14 +5559,14 @@ Exit: CoUninitialize(); - // update stream state - stream_.state = STREAM_STOPPED; - if ( !errorText.empty() ) { errorText_ = errorText; error( errorType ); } + + // update stream state + stream_.state = STREAM_STOPPED; } //******************** End of __WINDOWS_WASAPI__ *********************// @@ -6863,7 +6951,7 @@ void RtApiDs :: callbackEvent() if ( stream_.mode == DUPLEX ) { if ( safeReadPointer < endRead ) { if ( duplexPrerollBytes <= 0 ) { - // Pre-roll time over. Be more agressive. + // Pre-roll time over. Be more aggressive. int adjustment = endRead-safeReadPointer; handle->xrun[1] = true; @@ -7018,19 +7106,18 @@ static BOOL CALLBACK deviceQueryCallback( LPGUID lpguid, // If good device, then save its name and guid. std::string name = convertCharPointerToStdString( description ); - //if ( name == "Primary Sound Driver" || name == "Primary Sound Capture Driver" ) - if ( lpguid == NULL ) - name = "Default Device"; + if ( validDevice ) { for ( unsigned int i=0; i<dsDevices.size(); i++ ) { if ( dsDevices[i].name == name ) { - dsDevices[i].found = true; - if ( probeInfo.isInput ) { - dsDevices[i].id[1] = lpguid; + if ( probeInfo.isInput && dsDevices[i].id[1] == lpguid) + { + dsDevices[i].found = true; dsDevices[i].validId[1] = true; } - else { - dsDevices[i].id[0] = lpguid; + else if (dsDevices[i].id[0] == lpguid) + { + dsDevices[i].found = true; dsDevices[i].validId[0] = true; } return TRUE; @@ -7126,7 +7213,11 @@ struct AlsaHandle { bool runnable; AlsaHandle() - :synchronized(false), runnable(false) { xrun[0] = false; xrun[1] = false; } +#if _cplusplus >= 201103L + :handles{nullptr, nullptr}, synchronized(false), runnable(false) { xrun[0] = false; xrun[1] = false; } +#else + : synchronized(false), runnable(false) { handles[0] = NULL; handles[1] = NULL; xrun[0] = false; xrun[1] = false; } +#endif }; static void *alsaCallbackHandler( void * ptr ); @@ -7148,6 +7239,13 @@ unsigned int RtApiAlsa :: getDeviceCount( void ) char name[64]; snd_ctl_t *handle = 0; + strcpy(name, "default"); + result = snd_ctl_open( &handle, "default", 0 ); + if (result == 0) { + nDevices++; + snd_ctl_close( handle ); + } + // Count cards and devices card = -1; snd_card_next( &card ); @@ -7180,12 +7278,6 @@ unsigned int RtApiAlsa :: getDeviceCount( void ) snd_card_next( &card ); } - result = snd_ctl_open( &handle, "default", 0 ); - if (result == 0) { - nDevices++; - snd_ctl_close( handle ); - } - return nDevices; } @@ -7195,13 +7287,21 @@ RtAudio::DeviceInfo RtApiAlsa :: getDeviceInfo( unsigned int device ) info.probed = false; unsigned nDevices = 0; - int result, subdevice, card; + int result=-1, subdevice=-1, card=-1; char name[64]; snd_ctl_t *chandle = 0; + result = snd_ctl_open( &chandle, "default", SND_CTL_NONBLOCK ); + if ( result == 0 ) { + if ( nDevices++ == device ) { + strcpy( name, "default" ); + goto foundDevice; + } + } + if ( chandle ) + snd_ctl_close( chandle ); + // Count cards and devices - card = -1; - subdevice = -1; snd_card_next( &card ); while ( card >= 0 ) { sprintf( name, "hw:%d", card ); @@ -7235,15 +7335,6 @@ RtAudio::DeviceInfo RtApiAlsa :: getDeviceInfo( unsigned int device ) snd_card_next( &card ); } - result = snd_ctl_open( &chandle, "default", SND_CTL_NONBLOCK ); - if ( result == 0 ) { - if ( nDevices == device ) { - strcpy( name, "default" ); - goto foundDevice; - } - nDevices++; - } - if ( nDevices == 0 ) { errorText_ = "RtApiAlsa::getDeviceInfo: no devices found!"; error( RtAudioError::INVALID_USE ); @@ -7464,11 +7555,13 @@ RtAudio::DeviceInfo RtApiAlsa :: getDeviceInfo( unsigned int device ) } // Get the device name - char *cardname; - result = snd_card_get_name( card, &cardname ); - if ( result >= 0 ) { - sprintf( name, "hw:%s,%d", cardname, subdevice ); - free( cardname ); + if (strncmp(name, "default", 7)!=0) { + char *cardname; + result = snd_card_get_name( card, &cardname ); + if ( result >= 0 ) { + sprintf( name, "hw:%s,%d", cardname, subdevice ); + free( cardname ); + } } info.name = name; @@ -7495,8 +7588,12 @@ bool RtApiAlsa :: probeDeviceOpen( unsigned int device, StreamMode mode, unsigne { #if defined(__RTAUDIO_DEBUG__) - snd_output_t *out; - snd_output_stdio_attach(&out, stderr, 0); + struct SndOutputTdealloc { + SndOutputTdealloc() : _out(NULL) { snd_output_stdio_attach(&_out, stderr, 0); } + ~SndOutputTdealloc() { snd_output_close(_out); } + operator snd_output_t*() { return _out; } + snd_output_t *_out; + } out; #endif // I'm not using the "plug" interface ... too much inconsistent behavior. @@ -7506,9 +7603,23 @@ bool RtApiAlsa :: probeDeviceOpen( unsigned int device, StreamMode mode, unsigne char name[64]; snd_ctl_t *chandle; - if ( options && options->flags & RTAUDIO_ALSA_USE_DEFAULT ) - snprintf(name, sizeof(name), "%s", "default"); + if ( device == 0 + || (options && options->flags & RTAUDIO_ALSA_USE_DEFAULT) ) + { + strcpy(name, "default"); + result = snd_ctl_open( &chandle, "default", SND_CTL_NONBLOCK ); + if ( result == 0 ) { + if ( nDevices == device ) { + strcpy( name, "default" ); + snd_ctl_close( chandle ); + goto foundDevice; + } + nDevices++; + } + } + else { + nDevices++; // Count cards and devices card = -1; snd_card_next( &card ); @@ -7536,17 +7647,6 @@ bool RtApiAlsa :: probeDeviceOpen( unsigned int device, StreamMode mode, unsigne snd_card_next( &card ); } - result = snd_ctl_open( &chandle, "default", SND_CTL_NONBLOCK ); - if ( result == 0 ) { - if ( nDevices == device ) { - strcpy( name, "default" ); - snd_ctl_close( chandle ); - goto foundDevice; - } - nDevices++; - } - snd_ctl_close( chandle ); - if ( nDevices == 0 ) { // This should not happen because a check is made before this function is called. errorText_ = "RtApiAlsa::probeDeviceOpen: no devices found!"; @@ -8284,7 +8384,7 @@ void RtApiAlsa :: callbackEvent() } if ( result < (int) stream_.bufferSize ) { - // Either an error or overrun occured. + // Either an error or overrun occurred. if ( result == -EPIPE ) { snd_pcm_state_t state = snd_pcm_state( handle[1] ); if ( state == SND_PCM_STATE_XRUN ) { @@ -8354,7 +8454,7 @@ void RtApiAlsa :: callbackEvent() } if ( result < (int) stream_.bufferSize ) { - // Either an error or underrun occured. + // Either an error or underrun occurred. if ( result == -EPIPE ) { snd_pcm_state_t state = snd_pcm_state( handle[0] ); if ( state == SND_PCM_STATE_XRUN ) { @@ -8424,10 +8524,27 @@ static void *alsaCallbackHandler( void *ptr ) #include <pulse/error.h> #include <pulse/simple.h> +#include <pulse/pulseaudio.h> #include <cstdio> +static pa_mainloop_api *rt_pa_mainloop_api = NULL; +struct PaDeviceInfo { + PaDeviceInfo() : sink_index(-1), source_index(-1) {} + int sink_index; + int source_index; + std::string sink_name; + std::string source_name; + RtAudio::DeviceInfo info; +}; +static struct { + std::vector<PaDeviceInfo> dev; + std::string default_sink_name; + std::string default_source_name; + int default_rate; +} rt_pa_info; + static const unsigned int SUPPORTED_SAMPLERATES[] = { 8000, 16000, 22050, 32000, - 44100, 48000, 96000, 0}; + 44100, 48000, 96000, 192000, 0}; struct rtaudio_pa_format_mapping_t { RtAudioFormat rtaudio_format; @@ -8436,6 +8553,7 @@ struct rtaudio_pa_format_mapping_t { static const rtaudio_pa_format_mapping_t supported_sampleformats[] = { {RTAUDIO_SINT16, PA_SAMPLE_S16LE}, + {RTAUDIO_SINT24, PA_SAMPLE_S24LE}, {RTAUDIO_SINT32, PA_SAMPLE_S32LE}, {RTAUDIO_FLOAT32, PA_SAMPLE_FLOAT32LE}, {0, PA_SAMPLE_INVALID}}; @@ -8449,35 +8567,219 @@ struct PulseAudioHandle { PulseAudioHandle() : s_play(0), s_rec(0), runnable(false) { } }; +static void rt_pa_mainloop_api_quit(int ret) { + rt_pa_mainloop_api->quit(rt_pa_mainloop_api, ret); +} + +static void rt_pa_set_server_info(pa_context *context, const pa_server_info *info, void *data){ + (void)context; + (void)data; + pa_sample_spec ss; + + if (!info) { + rt_pa_mainloop_api_quit(1); + return; + } + + ss = info->sample_spec; + + rt_pa_info.default_rate = ss.rate; + rt_pa_info.default_sink_name = info->default_sink_name; + rt_pa_info.default_source_name = info->default_source_name; +} + +static void rt_pa_set_sink_info(pa_context * /*c*/, const pa_sink_info *i, + int eol, void * /*userdata*/) +{ + if (eol) return; + PaDeviceInfo inf; + inf.info.name = pa_proplist_gets(i->proplist, "device.description"); + inf.info.probed = true; + inf.info.outputChannels = i->sample_spec.channels; + inf.info.preferredSampleRate = i->sample_spec.rate; + inf.info.isDefaultOutput = (rt_pa_info.default_sink_name == i->name); + inf.sink_index = i->index; + inf.sink_name = i->name; + for ( const unsigned int *sr = SUPPORTED_SAMPLERATES; *sr; ++sr ) + inf.info.sampleRates.push_back( *sr ); + for ( const rtaudio_pa_format_mapping_t *fm = supported_sampleformats; + fm->rtaudio_format; ++fm ) + inf.info.nativeFormats |= fm->rtaudio_format; + for (size_t i=0; i < rt_pa_info.dev.size(); i++) + { + /* Attempt to match up sink and source records by device description. */ + if (rt_pa_info.dev[i].info.name == inf.info.name) { + rt_pa_info.dev[i].sink_index = inf.sink_index; + rt_pa_info.dev[i].sink_name = inf.sink_name; + rt_pa_info.dev[i].info.outputChannels = inf.info.outputChannels; + rt_pa_info.dev[i].info.isDefaultOutput = inf.info.isDefaultOutput; + /* Assume duplex channels are minimum of input and output channels. */ + /* Uncomment if we add support for DUPLEX + if (rt_pa_info.dev[i].source_index > -1) + (inf.info.outputChannels < rt_pa_info.dev[i].info.inputChannels) + ? inf.info.outputChannels : rt_pa_info.dev[i].info.inputChannels; + */ + return; + } + } + /* try to ensure device #0 is the default */ + if (inf.info.isDefaultOutput) + rt_pa_info.dev.insert(rt_pa_info.dev.begin(), inf); + else + rt_pa_info.dev.push_back(inf); +} + +static void rt_pa_set_source_info_and_quit(pa_context * /*c*/, const pa_source_info *i, + int eol, void * /*userdata*/) +{ + if (eol) { + rt_pa_mainloop_api_quit(0); + return; + } + PaDeviceInfo inf; + inf.info.name = pa_proplist_gets(i->proplist, "device.description"); + inf.info.probed = true; + inf.info.inputChannels = i->sample_spec.channels; + inf.info.preferredSampleRate = i->sample_spec.rate; + inf.info.isDefaultInput = (rt_pa_info.default_source_name == i->name); + inf.source_index = i->index; + inf.source_name = i->name; + for ( const unsigned int *sr = SUPPORTED_SAMPLERATES; *sr; ++sr ) + inf.info.sampleRates.push_back( *sr ); + for ( const rtaudio_pa_format_mapping_t *fm = supported_sampleformats; + fm->rtaudio_format; ++fm ) + inf.info.nativeFormats |= fm->rtaudio_format; + + for (size_t i=0; i < rt_pa_info.dev.size(); i++) + { + /* Attempt to match up sink and source records by device description. */ + if (rt_pa_info.dev[i].info.name == inf.info.name) { + rt_pa_info.dev[i].source_index = inf.source_index; + rt_pa_info.dev[i].source_name = inf.source_name; + rt_pa_info.dev[i].info.inputChannels = inf.info.inputChannels; + rt_pa_info.dev[i].info.isDefaultInput = inf.info.isDefaultInput; + /* Assume duplex channels are minimum of input and output channels. */ + /* Uncomment if we add support for DUPLEX + if (rt_pa_info.dev[i].sink_index > -1) { + rt_pa_info.dev[i].info.duplexChannels = + (inf.info.inputChannels < rt_pa_info.dev[i].info.outputChannels) + ? inf.info.inputChannels : rt_pa_info.dev[i].info.outputChannels; + } + */ + return; + } + } + /* try to ensure device #0 is the default */ + if (inf.info.isDefaultInput) + rt_pa_info.dev.insert(rt_pa_info.dev.begin(), inf); + else + rt_pa_info.dev.push_back(inf); +} + +static void rt_pa_context_state_callback(pa_context *context, void *userdata) { + (void)userdata; + + auto state = pa_context_get_state(context); + switch (state) { + case PA_CONTEXT_CONNECTING: + case PA_CONTEXT_AUTHORIZING: + case PA_CONTEXT_SETTING_NAME: + break; + + case PA_CONTEXT_READY: + rt_pa_info.dev.clear(); + pa_context_get_server_info(context, rt_pa_set_server_info, NULL); + pa_context_get_sink_info_list(context, rt_pa_set_sink_info, NULL); + pa_context_get_source_info_list(context, rt_pa_set_source_info_and_quit, NULL); + break; + + case PA_CONTEXT_TERMINATED: + rt_pa_mainloop_api_quit(0); + break; + + case PA_CONTEXT_FAILED: + default: + rt_pa_mainloop_api_quit(1); + } +} + RtApiPulse::~RtApiPulse() { if ( stream_.state != STREAM_CLOSED ) closeStream(); } -unsigned int RtApiPulse::getDeviceCount( void ) +void RtApiPulse::collectDeviceInfo( void ) { - return 1; -} + pa_context *context = NULL; + pa_mainloop *m = NULL; + char *server = NULL; + int ret = 1; -RtAudio::DeviceInfo RtApiPulse::getDeviceInfo( unsigned int /*device*/ ) -{ - RtAudio::DeviceInfo info; - info.probed = true; - info.name = "PulseAudio"; - info.outputChannels = 2; - info.inputChannels = 2; - info.duplexChannels = 2; - info.isDefaultOutput = true; - info.isDefaultInput = true; + if (!(m = pa_mainloop_new())) { + errorStream_ << "RtApiPulse::DeviceInfo pa_mainloop_new() failed."; + errorText_ = errorStream_.str(); + error( RtAudioError::WARNING ); + goto quit; + } - for ( const unsigned int *sr = SUPPORTED_SAMPLERATES; *sr; ++sr ) - info.sampleRates.push_back( *sr ); + rt_pa_mainloop_api = pa_mainloop_get_api(m); - info.preferredSampleRate = 48000; - info.nativeFormats = RTAUDIO_SINT16 | RTAUDIO_SINT32 | RTAUDIO_FLOAT32; + if (!(context = pa_context_new_with_proplist(rt_pa_mainloop_api, NULL, NULL))) { + errorStream_ << "pa_context_new() failed."; + errorText_ = errorStream_.str(); + error( RtAudioError::WARNING ); + goto quit; + } - return info; + pa_context_set_state_callback(context, rt_pa_context_state_callback, NULL); + + if (pa_context_connect(context, server, PA_CONTEXT_NOFLAGS, NULL) < 0) { + errorStream_ << "RtApiPulse::DeviceInfo pa_context_connect() failed: " + << pa_strerror(pa_context_errno(context)); + errorText_ = errorStream_.str(); + error( RtAudioError::WARNING ); + goto quit; + } + + if (pa_mainloop_run(m, &ret) < 0) { + errorStream_ << "pa_mainloop_run() failed."; + errorText_ = errorStream_.str(); + error( RtAudioError::WARNING ); + goto quit; + } + + if (ret != 0) { + errorStream_ << "could not get server info."; + errorText_ = errorStream_.str(); + error( RtAudioError::WARNING ); + goto quit; + } + +quit: + if (context) + pa_context_unref(context); + + if (m) { + pa_mainloop_free(m); + } + + pa_xfree(server); +} + +unsigned int RtApiPulse::getDeviceCount( void ) +{ + collectDeviceInfo(); + return rt_pa_info.dev.size(); +} + +RtAudio::DeviceInfo RtApiPulse::getDeviceInfo( unsigned int device ) +{ + if (rt_pa_info.dev.size()==0) + collectDeviceInfo(); + if (device < rt_pa_info.dev.size()) + return rt_pa_info.dev[device].info; + return RtAudio::DeviceInfo(); } static void *pulseaudio_callback( void * user ) @@ -8679,15 +8981,18 @@ void RtApiPulse::stopStream( void ) stream_.state = STREAM_STOPPED; MUTEX_LOCK( &stream_.mutex ); - if ( pah && pah->s_play ) { - int pa_error; - if ( pa_simple_drain( pah->s_play, &pa_error ) < 0 ) { - errorStream_ << "RtApiPulse::stopStream: error draining output device, " << - pa_strerror( pa_error ) << "."; - errorText_ = errorStream_.str(); - MUTEX_UNLOCK( &stream_.mutex ); - error( RtAudioError::SYSTEM_ERROR ); - return; + if ( pah ) { + pah->runnable = false; + if ( pah->s_play ) { + int pa_error; + if ( pa_simple_drain( pah->s_play, &pa_error ) < 0 ) { + errorStream_ << "RtApiPulse::stopStream: error draining output device, " << + pa_strerror( pa_error ) << "."; + errorText_ = errorStream_.str(); + MUTEX_UNLOCK( &stream_.mutex ); + error( RtAudioError::SYSTEM_ERROR ); + return; + } } } @@ -8713,15 +9018,18 @@ void RtApiPulse::abortStream( void ) stream_.state = STREAM_STOPPED; MUTEX_LOCK( &stream_.mutex ); - if ( pah && pah->s_play ) { - int pa_error; - if ( pa_simple_flush( pah->s_play, &pa_error ) < 0 ) { - errorStream_ << "RtApiPulse::abortStream: error flushing output device, " << - pa_strerror( pa_error ) << "."; - errorText_ = errorStream_.str(); - MUTEX_UNLOCK( &stream_.mutex ); - error( RtAudioError::SYSTEM_ERROR ); - return; + if ( pah ) { + pah->runnable = false; + if ( pah->s_play ) { + int pa_error; + if ( pa_simple_flush( pah->s_play, &pa_error ) < 0 ) { + errorStream_ << "RtApiPulse::abortStream: error flushing output device, " << + pa_strerror( pa_error ) << "."; + errorText_ = errorStream_.str(); + MUTEX_UNLOCK( &stream_.mutex ); + error( RtAudioError::SYSTEM_ERROR ); + return; + } } } @@ -8738,15 +9046,51 @@ bool RtApiPulse::probeDeviceOpen( unsigned int device, StreamMode mode, unsigned long bufferBytes = 0; pa_sample_spec ss; - if ( device != 0 ) return false; - if ( mode != INPUT && mode != OUTPUT ) return false; - if ( channels != 1 && channels != 2 ) { - errorText_ = "RtApiPulse::probeDeviceOpen: unsupported number of channels."; + if ( device >= rt_pa_info.dev.size() ) return false; + if ( firstChannel != 0 ) { + errorText_ = "PulseAudio does not support channel offset mapping."; + return false; + } + + /* these may be NULL for default, but we've already got the names */ + const char *dev_input = NULL; + const char *dev_output = NULL; + if (!rt_pa_info.dev[device].source_name.empty()) + dev_input = rt_pa_info.dev[device].source_name.c_str(); + if (!rt_pa_info.dev[device].sink_name.empty()) + dev_output = rt_pa_info.dev[device].sink_name.c_str(); + + if (mode==INPUT && rt_pa_info.dev[device].info.inputChannels == 0) { + errorText_ = "PulseAudio device does not support input."; + return false; + } + if (mode==OUTPUT && rt_pa_info.dev[device].info.outputChannels == 0) { + errorText_ = "PulseAudio device does not support output."; + return false; + } + if (mode==DUPLEX && rt_pa_info.dev[device].info.duplexChannels == 0) { + /* Note: will always error, DUPLEX not yet supported */ + errorText_ = "PulseAudio device does not support duplex."; + return false; + } + + if (mode==INPUT && rt_pa_info.dev[device].info.inputChannels < channels) { + errorText_ = "PulseAudio: unsupported number of input channels."; return false; } - ss.channels = channels; - if ( firstChannel != 0 ) return false; + if (mode==OUTPUT && rt_pa_info.dev[device].info.outputChannels < channels) { + errorText_ = "PulseAudio: unsupported number of output channels."; + return false; + } + + if (mode==DUPLEX && rt_pa_info.dev[device].info.duplexChannels < channels) { + /* Note: will always error, DUPLEX not yet supported */ + errorText_ = "PulseAudio: unsupported number of duplex channels."; + return false; + } + + ss.channels = channels; bool sr_found = false; for ( const unsigned int *sr = SUPPORTED_SAMPLERATES; *sr; ++sr ) { @@ -8758,8 +9102,8 @@ bool RtApiPulse::probeDeviceOpen( unsigned int device, StreamMode mode, } } if ( !sr_found ) { - errorText_ = "RtApiPulse::probeDeviceOpen: unsupported sample rate."; - return false; + stream_.sampleRate = sampleRate; + ss.rate = sampleRate; } bool sf_found = 0; @@ -8783,7 +9127,7 @@ bool RtApiPulse::probeDeviceOpen( unsigned int device, StreamMode mode, if ( options && options->flags & RTAUDIO_NONINTERLEAVED ) stream_.userInterleaved = false; else stream_.userInterleaved = true; stream_.deviceInterleaved[mode] = true; - stream_.nBuffers = 1; + stream_.nBuffers = options ? options->numberOfBuffers : 1; stream_.doByteSwap[mode] = false; stream_.nUserChannels[mode] = channels; stream_.nDeviceChannels[mode] = channels + firstChannel; @@ -8796,6 +9140,8 @@ bool RtApiPulse::probeDeviceOpen( unsigned int device, StreamMode mode, stream_.doConvertBuffer[mode] = true; if ( stream_.nUserChannels[mode] < stream_.nDeviceChannels[mode] ) stream_.doConvertBuffer[mode] = true; + if ( stream_.userInterleaved != stream_.deviceInterleaved[mode] ) + stream_.doConvertBuffer[mode] = true; // Allocate necessary internal buffers. bufferBytes = stream_.nUserChannels[mode] * *bufferSize * formatBytes( stream_.userFormat ); @@ -8851,24 +9197,47 @@ bool RtApiPulse::probeDeviceOpen( unsigned int device, StreamMode mode, int error; if ( options && !options->streamName.empty() ) streamName = options->streamName; switch ( mode ) { - case INPUT: pa_buffer_attr buffer_attr; + case INPUT: buffer_attr.fragsize = bufferBytes; buffer_attr.maxlength = -1; - pah->s_rec = pa_simple_new( NULL, streamName.c_str(), PA_STREAM_RECORD, NULL, "Record", &ss, NULL, &buffer_attr, &error ); + pah->s_rec = pa_simple_new( NULL, streamName.c_str(), PA_STREAM_RECORD, + dev_input, "Record", &ss, NULL, &buffer_attr, &error ); if ( !pah->s_rec ) { errorText_ = "RtApiPulse::probeDeviceOpen: error connecting input to PulseAudio server."; goto error; } break; - case OUTPUT: - pah->s_play = pa_simple_new( NULL, streamName.c_str(), PA_STREAM_PLAYBACK, NULL, "Playback", &ss, NULL, NULL, &error ); + case OUTPUT: { + pa_buffer_attr * attr_ptr; + + if ( options && options->numberOfBuffers > 0 ) { + // pa_buffer_attr::fragsize is recording-only. + // Hopefully PortAudio won't access uninitialized fields. + buffer_attr.maxlength = bufferBytes * options->numberOfBuffers; + buffer_attr.minreq = -1; + buffer_attr.prebuf = -1; + buffer_attr.tlength = -1; + attr_ptr = &buffer_attr; + } else { + attr_ptr = nullptr; + } + + pah->s_play = pa_simple_new( NULL, streamName.c_str(), PA_STREAM_PLAYBACK, + dev_output, "Playback", &ss, NULL, attr_ptr, &error ); if ( !pah->s_play ) { errorText_ = "RtApiPulse::probeDeviceOpen: error connecting output to PulseAudio server."; goto error; } break; + } + case DUPLEX: + /* Note: We could add DUPLEX by synchronizing multiple streams, + but it would mean moving from Simple API to Asynchronous API: + https://freedesktop.org/software/pulseaudio/doxygen/streams.html#sync_streams */ + errorText_ = "RtApiPulse::probeDeviceOpen: duplex not supported for PulseAudio."; + goto error; default: goto error; } @@ -10117,24 +10486,19 @@ void RtApi :: convertBuffer( char *outBuffer, char *inBuffer, ConvertInfo &info // data interleaving/deinterleaving. 24-bit integers are assumed to occupy // the lower three bytes of a 32-bit integer. - // Clear our device buffer when in/out duplex device channels are different - if ( outBuffer == stream_.deviceBuffer && stream_.mode == DUPLEX && - ( stream_.nDeviceChannels[0] < stream_.nDeviceChannels[1] ) ) + // Clear our duplex device output buffer if there are more device outputs than user outputs + if ( outBuffer == stream_.deviceBuffer && stream_.mode == DUPLEX && info.outJump > info.inJump ) memset( outBuffer, 0, stream_.bufferSize * info.outJump * formatBytes( info.outFormat ) ); int j; if (info.outFormat == RTAUDIO_FLOAT64) { - Float64 scale; Float64 *out = (Float64 *)outBuffer; if (info.inFormat == RTAUDIO_SINT8) { signed char *in = (signed char *)inBuffer; - scale = 1.0 / 127.5; for (unsigned int i=0; i<stream_.bufferSize; i++) { for (j=0; j<info.channels; j++) { - out[info.outOffset[j]] = (Float64) in[info.inOffset[j]]; - out[info.outOffset[j]] += 0.5; - out[info.outOffset[j]] *= scale; + out[info.outOffset[j]] = (Float64) in[info.inOffset[j]] / 128.0; } in += info.inJump; out += info.outJump; @@ -10142,12 +10506,9 @@ void RtApi :: convertBuffer( char *outBuffer, char *inBuffer, ConvertInfo &info } else if (info.inFormat == RTAUDIO_SINT16) { Int16 *in = (Int16 *)inBuffer; - scale = 1.0 / 32767.5; for (unsigned int i=0; i<stream_.bufferSize; i++) { for (j=0; j<info.channels; j++) { - out[info.outOffset[j]] = (Float64) in[info.inOffset[j]]; - out[info.outOffset[j]] += 0.5; - out[info.outOffset[j]] *= scale; + out[info.outOffset[j]] = (Float64) in[info.inOffset[j]] / 32768.0; } in += info.inJump; out += info.outJump; @@ -10155,12 +10516,9 @@ void RtApi :: convertBuffer( char *outBuffer, char *inBuffer, ConvertInfo &info } else if (info.inFormat == RTAUDIO_SINT24) { Int24 *in = (Int24 *)inBuffer; - scale = 1.0 / 8388607.5; for (unsigned int i=0; i<stream_.bufferSize; i++) { for (j=0; j<info.channels; j++) { - out[info.outOffset[j]] = (Float64) (in[info.inOffset[j]].asInt()); - out[info.outOffset[j]] += 0.5; - out[info.outOffset[j]] *= scale; + out[info.outOffset[j]] = (Float64) in[info.inOffset[j]].asInt() / 8388608.0; } in += info.inJump; out += info.outJump; @@ -10168,12 +10526,9 @@ void RtApi :: convertBuffer( char *outBuffer, char *inBuffer, ConvertInfo &info } else if (info.inFormat == RTAUDIO_SINT32) { Int32 *in = (Int32 *)inBuffer; - scale = 1.0 / 2147483647.5; for (unsigned int i=0; i<stream_.bufferSize; i++) { for (j=0; j<info.channels; j++) { - out[info.outOffset[j]] = (Float64) in[info.inOffset[j]]; - out[info.outOffset[j]] += 0.5; - out[info.outOffset[j]] *= scale; + out[info.outOffset[j]] = (Float64) in[info.inOffset[j]] / 2147483648.0; } in += info.inJump; out += info.outJump; @@ -10202,17 +10557,13 @@ void RtApi :: convertBuffer( char *outBuffer, char *inBuffer, ConvertInfo &info } } else if (info.outFormat == RTAUDIO_FLOAT32) { - Float32 scale; Float32 *out = (Float32 *)outBuffer; if (info.inFormat == RTAUDIO_SINT8) { signed char *in = (signed char *)inBuffer; - scale = (Float32) ( 1.0 / 127.5 ); for (unsigned int i=0; i<stream_.bufferSize; i++) { for (j=0; j<info.channels; j++) { - out[info.outOffset[j]] = (Float32) in[info.inOffset[j]]; - out[info.outOffset[j]] += 0.5; - out[info.outOffset[j]] *= scale; + out[info.outOffset[j]] = (Float32) in[info.inOffset[j]] / 128.f; } in += info.inJump; out += info.outJump; @@ -10220,12 +10571,9 @@ void RtApi :: convertBuffer( char *outBuffer, char *inBuffer, ConvertInfo &info } else if (info.inFormat == RTAUDIO_SINT16) { Int16 *in = (Int16 *)inBuffer; - scale = (Float32) ( 1.0 / 32767.5 ); for (unsigned int i=0; i<stream_.bufferSize; i++) { for (j=0; j<info.channels; j++) { - out[info.outOffset[j]] = (Float32) in[info.inOffset[j]]; - out[info.outOffset[j]] += 0.5; - out[info.outOffset[j]] *= scale; + out[info.outOffset[j]] = (Float32) in[info.inOffset[j]] / 32768.f; } in += info.inJump; out += info.outJump; @@ -10233,12 +10581,9 @@ void RtApi :: convertBuffer( char *outBuffer, char *inBuffer, ConvertInfo &info } else if (info.inFormat == RTAUDIO_SINT24) { Int24 *in = (Int24 *)inBuffer; - scale = (Float32) ( 1.0 / 8388607.5 ); for (unsigned int i=0; i<stream_.bufferSize; i++) { for (j=0; j<info.channels; j++) { - out[info.outOffset[j]] = (Float32) (in[info.inOffset[j]].asInt()); - out[info.outOffset[j]] += 0.5; - out[info.outOffset[j]] *= scale; + out[info.outOffset[j]] = (Float32) in[info.inOffset[j]].asInt() / 8388608.f; } in += info.inJump; out += info.outJump; @@ -10246,12 +10591,9 @@ void RtApi :: convertBuffer( char *outBuffer, char *inBuffer, ConvertInfo &info } else if (info.inFormat == RTAUDIO_SINT32) { Int32 *in = (Int32 *)inBuffer; - scale = (Float32) ( 1.0 / 2147483647.5 ); for (unsigned int i=0; i<stream_.bufferSize; i++) { for (j=0; j<info.channels; j++) { - out[info.outOffset[j]] = (Float32) in[info.inOffset[j]]; - out[info.outOffset[j]] += 0.5; - out[info.outOffset[j]] *= scale; + out[info.outOffset[j]] = (Float32) in[info.inOffset[j]] / 2147483648.f; } in += info.inJump; out += info.outJump; @@ -10329,7 +10671,8 @@ void RtApi :: convertBuffer( char *outBuffer, char *inBuffer, ConvertInfo &info Float32 *in = (Float32 *)inBuffer; for (unsigned int i=0; i<stream_.bufferSize; i++) { for (j=0; j<info.channels; j++) { - out[info.outOffset[j]] = (Int32) (in[info.inOffset[j]] * 2147483647.5 - 0.5); + // Use llround() which returns `long long` which is guaranteed to be at least 64 bits. + out[info.outOffset[j]] = (Int32) std::min(std::llround(in[info.inOffset[j]] * 2147483648.f), 2147483647LL); } in += info.inJump; out += info.outJump; @@ -10339,7 +10682,7 @@ void RtApi :: convertBuffer( char *outBuffer, char *inBuffer, ConvertInfo &info Float64 *in = (Float64 *)inBuffer; for (unsigned int i=0; i<stream_.bufferSize; i++) { for (j=0; j<info.channels; j++) { - out[info.outOffset[j]] = (Int32) (in[info.inOffset[j]] * 2147483647.5 - 0.5); + out[info.outOffset[j]] = (Int32) std::min(std::llround(in[info.inOffset[j]] * 2147483648.0), 2147483647LL); } in += info.inJump; out += info.outJump; @@ -10396,7 +10739,7 @@ void RtApi :: convertBuffer( char *outBuffer, char *inBuffer, ConvertInfo &info Float32 *in = (Float32 *)inBuffer; for (unsigned int i=0; i<stream_.bufferSize; i++) { for (j=0; j<info.channels; j++) { - out[info.outOffset[j]] = (Int32) (in[info.inOffset[j]] * 8388607.5 - 0.5); + out[info.outOffset[j]] = (Int32) std::min(std::llround(in[info.inOffset[j]] * 8388608.f), 8388607LL); } in += info.inJump; out += info.outJump; @@ -10406,7 +10749,7 @@ void RtApi :: convertBuffer( char *outBuffer, char *inBuffer, ConvertInfo &info Float64 *in = (Float64 *)inBuffer; for (unsigned int i=0; i<stream_.bufferSize; i++) { for (j=0; j<info.channels; j++) { - out[info.outOffset[j]] = (Int32) (in[info.inOffset[j]] * 8388607.5 - 0.5); + out[info.outOffset[j]] = (Int32) std::min(std::llround(in[info.inOffset[j]] * 8388608.0), 8388607LL); } in += info.inJump; out += info.outJump; @@ -10461,7 +10804,7 @@ void RtApi :: convertBuffer( char *outBuffer, char *inBuffer, ConvertInfo &info Float32 *in = (Float32 *)inBuffer; for (unsigned int i=0; i<stream_.bufferSize; i++) { for (j=0; j<info.channels; j++) { - out[info.outOffset[j]] = (Int16) (in[info.inOffset[j]] * 32767.5 - 0.5); + out[info.outOffset[j]] = (Int16) std::min(std::llround(in[info.inOffset[j]] * 32768.f), 32767LL); } in += info.inJump; out += info.outJump; @@ -10471,7 +10814,7 @@ void RtApi :: convertBuffer( char *outBuffer, char *inBuffer, ConvertInfo &info Float64 *in = (Float64 *)inBuffer; for (unsigned int i=0; i<stream_.bufferSize; i++) { for (j=0; j<info.channels; j++) { - out[info.outOffset[j]] = (Int16) (in[info.inOffset[j]] * 32767.5 - 0.5); + out[info.outOffset[j]] = (Int16) std::min(std::llround(in[info.inOffset[j]] * 32768.0), 32767LL); } in += info.inJump; out += info.outJump; @@ -10525,7 +10868,7 @@ void RtApi :: convertBuffer( char *outBuffer, char *inBuffer, ConvertInfo &info Float32 *in = (Float32 *)inBuffer; for (unsigned int i=0; i<stream_.bufferSize; i++) { for (j=0; j<info.channels; j++) { - out[info.outOffset[j]] = (signed char) (in[info.inOffset[j]] * 127.5 - 0.5); + out[info.outOffset[j]] = (signed char) std::min(std::llround(in[info.inOffset[j]] * 128.f), 127LL); } in += info.inJump; out += info.outJump; @@ -10535,7 +10878,7 @@ void RtApi :: convertBuffer( char *outBuffer, char *inBuffer, ConvertInfo &info Float64 *in = (Float64 *)inBuffer; for (unsigned int i=0; i<stream_.bufferSize; i++) { for (j=0; j<info.channels; j++) { - out[info.outOffset[j]] = (signed char) (in[info.inOffset[j]] * 127.5 - 0.5); + out[info.outOffset[j]] = (signed char) std::min(std::llround(in[info.inOffset[j]] * 128.0), 127LL); } in += info.inJump; out += info.outJump; diff --git a/src/rtaudio/RtAudio.h b/src/rtaudio/RtAudio.h index 17f442b..1aa42e0 100644 --- a/src/rtaudio/RtAudio.h +++ b/src/rtaudio/RtAudio.h @@ -11,7 +11,7 @@ RtAudio WWW site: http://www.music.mcgill.ca/~gary/rtaudio/ RtAudio: realtime audio i/o C++ classes - Copyright (c) 2001-2019 Gary P. Scavone + Copyright (c) 2001-2021 Gary P. Scavone Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files @@ -46,7 +46,7 @@ #ifndef __RTAUDIO_H #define __RTAUDIO_H -#define RTAUDIO_VERSION "5.1.0" +#define RTAUDIO_VERSION "5.2.0" #if defined _WIN32 || defined __CYGWIN__ #if defined(RTAUDIO_EXPORT) @@ -226,12 +226,12 @@ class RTAUDIO_DLL_PUBLIC RtAudioError : public std::runtime_error UNSPECIFIED, /*!< The default, unspecified error type. */ NO_DEVICES_FOUND, /*!< No devices found on system. */ INVALID_DEVICE, /*!< An invalid device ID was specified. */ - MEMORY_ERROR, /*!< An error occured during memory allocation. */ + MEMORY_ERROR, /*!< An error occurred during memory allocation. */ INVALID_PARAMETER, /*!< An invalid parameter was specified to a function. */ INVALID_USE, /*!< The function was called incorrectly. */ - DRIVER_ERROR, /*!< A system driver error occured. */ - SYSTEM_ERROR, /*!< A system error occured. */ - THREAD_ERROR /*!< A thread error occured. */ + DRIVER_ERROR, /*!< A system driver error occurred. */ + SYSTEM_ERROR, /*!< A system error occurred. */ + THREAD_ERROR /*!< A thread error occurred. */ }; //! The constructor. @@ -299,30 +299,21 @@ class RTAUDIO_DLL_PUBLIC RtAudio struct DeviceInfo { bool probed; /*!< true if the device capabilities were successfully probed. */ std::string name; /*!< Character string device identifier. */ - unsigned int outputChannels; /*!< Maximum output channels supported by device. */ - unsigned int inputChannels; /*!< Maximum input channels supported by device. */ - unsigned int duplexChannels; /*!< Maximum simultaneous input/output channels supported by device. */ - bool isDefaultOutput; /*!< true if this is the default output device. */ - bool isDefaultInput; /*!< true if this is the default input device. */ + unsigned int outputChannels{}; /*!< Maximum output channels supported by device. */ + unsigned int inputChannels{}; /*!< Maximum input channels supported by device. */ + unsigned int duplexChannels{}; /*!< Maximum simultaneous input/output channels supported by device. */ + bool isDefaultOutput{false}; /*!< true if this is the default output device. */ + bool isDefaultInput{false}; /*!< true if this is the default input device. */ std::vector<unsigned int> sampleRates; /*!< Supported sample rates (queried from list of standard rates). */ - unsigned int preferredSampleRate; /*!< Preferred sample rate, e.g. for WASAPI the system sample rate. */ - RtAudioFormat nativeFormats; /*!< Bit mask of supported data formats. */ - - // Default constructor. - DeviceInfo() - :probed(false), outputChannels(0), inputChannels(0), duplexChannels(0), - isDefaultOutput(false), isDefaultInput(false), preferredSampleRate(0), nativeFormats(0) {} + unsigned int preferredSampleRate{}; /*!< Preferred sample rate, e.g. for WASAPI the system sample rate. */ + RtAudioFormat nativeFormats{}; /*!< Bit mask of supported data formats. */ }; - //! The structure for specifying input or ouput stream parameters. + //! The structure for specifying input or output stream parameters. struct StreamParameters { - unsigned int deviceId; /*!< Device index (0 to getDeviceCount() - 1). */ - unsigned int nChannels; /*!< Number of channels. */ - unsigned int firstChannel; /*!< First channel index on device (default = 0). */ - - // Default constructor. - StreamParameters() - : deviceId(0), nChannels(0), firstChannel(0) {} + unsigned int deviceId{}; /*!< Device index (0 to getDeviceCount() - 1). */ + unsigned int nChannels{}; /*!< Number of channels. */ + unsigned int firstChannel{}; /*!< First channel index on device (default = 0). */ }; //! The structure for specifying stream options. @@ -383,14 +374,10 @@ class RTAUDIO_DLL_PUBLIC RtAudio RtAudio with Jack, each instance must have a unique client name. */ struct StreamOptions { - RtAudioStreamFlags flags; /*!< A bit-mask of stream flags (RTAUDIO_NONINTERLEAVED, RTAUDIO_MINIMIZE_LATENCY, RTAUDIO_HOG_DEVICE, RTAUDIO_ALSA_USE_DEFAULT). */ - unsigned int numberOfBuffers; /*!< Number of stream buffers. */ + RtAudioStreamFlags flags{}; /*!< A bit-mask of stream flags (RTAUDIO_NONINTERLEAVED, RTAUDIO_MINIMIZE_LATENCY, RTAUDIO_HOG_DEVICE, RTAUDIO_ALSA_USE_DEFAULT). */ + unsigned int numberOfBuffers{}; /*!< Number of stream buffers. */ std::string streamName; /*!< A stream name (currently used only in Jack). */ - int priority; /*!< Scheduling priority of callback thread (only used with flag RTAUDIO_SCHEDULE_REALTIME). */ - - // Default constructor. - StreamOptions() - : flags(0), numberOfBuffers(0), priority(0) {} + int priority{}; /*!< Scheduling priority of callback thread (only used with flag RTAUDIO_SCHEDULE_REALTIME). */ }; //! A static function to determine the current RtAudio version. @@ -527,7 +514,7 @@ class RTAUDIO_DLL_PUBLIC RtAudio lowest allowable value is used. The actual value used is returned via the structure argument. The parameter is API dependent. \param errorCallback A client-defined function that will be invoked - when an error has occured. + when an error has occurred. */ void openStream( RtAudio::StreamParameters *outputParameters, RtAudio::StreamParameters *inputParameters, @@ -616,7 +603,7 @@ class RTAUDIO_DLL_PUBLIC RtAudio }; // Operating system dependent thread functionality. -#if defined(__WINDOWS_DS__) || defined(__WINDOWS_ASIO__) || defined(__WINDOWS_WASAPI__) +#if defined(_WIN32) || defined(__CYGWIN__) #ifndef NOMINMAX #define NOMINMAX @@ -628,18 +615,22 @@ class RTAUDIO_DLL_PUBLIC RtAudio typedef uintptr_t ThreadHandle; typedef CRITICAL_SECTION StreamMutex; -#elif defined(__LINUX_ALSA__) || defined(__LINUX_PULSE__) || defined(__UNIX_JACK__) || defined(__LINUX_OSS__) || defined(__MACOSX_CORE__) +#else + // Using pthread library for various flavors of unix. #include <pthread.h> typedef pthread_t ThreadHandle; typedef pthread_mutex_t StreamMutex; -#else // Setup for "dummy" behavior +#endif + +// Setup for "dummy" behavior if no apis specified. +#if !(defined(__WINDOWS_DS__) || defined(__WINDOWS_ASIO__) || defined(__WINDOWS_WASAPI__) \ + || defined(__LINUX_ALSA__) || defined(__LINUX_PULSE__) || defined(__UNIX_JACK__) \ + || defined(__LINUX_OSS__) || defined(__MACOSX_CORE__)) #define __RTAUDIO_DUMMY__ - typedef int ThreadHandle; - typedef int StreamMutex; #endif @@ -647,19 +638,15 @@ class RTAUDIO_DLL_PUBLIC RtAudio // between the private RtAudio stream structure and global callback // handling functions. struct CallbackInfo { - void *object; // Used as a "this" pointer. - ThreadHandle thread; - void *callback; - void *userData; - void *errorCallback; - void *apiInfo; // void pointer for API specific callback information - bool isRunning; - bool doRealtime; - int priority; - - // Default constructor. - CallbackInfo() - :object(0), callback(0), userData(0), errorCallback(0), apiInfo(0), isRunning(false), doRealtime(false), priority(0) {} + void *object{}; // Used as a "this" pointer. + ThreadHandle thread{}; + void *callback{}; + void *userData{}; + void *errorCallback{}; + void *apiInfo{}; // void pointer for API specific callback information + bool isRunning{false}; + bool doRealtime{false}; + int priority{}; }; // **************************************************************** // @@ -686,9 +673,9 @@ class S24 { S24() {} S24& operator = ( const int& i ) { - c3[0] = (i & 0x000000ff); - c3[1] = (i & 0x0000ff00) >> 8; - c3[2] = (i & 0x00ff0000) >> 16; + c3[0] = (unsigned char)(i & 0x000000ff); + c3[1] = (unsigned char)((i & 0x0000ff00) >> 8); + c3[2] = (unsigned char)((i & 0x00ff0000) >> 16); return *this; } @@ -895,20 +882,20 @@ public: RtApiCore(); ~RtApiCore(); - RtAudio::Api getCurrentApi( void ) { return RtAudio::MACOSX_CORE; } - unsigned int getDeviceCount( void ); - RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); - unsigned int getDefaultOutputDevice( void ); - unsigned int getDefaultInputDevice( void ); - void closeStream( void ); - void startStream( void ); - void stopStream( void ); - void abortStream( void ); + RtAudio::Api getCurrentApi( void ) override { return RtAudio::MACOSX_CORE; } + unsigned int getDeviceCount( void ) override; + RtAudio::DeviceInfo getDeviceInfo( unsigned int device ) override; + unsigned int getDefaultOutputDevice( void ) override; + unsigned int getDefaultInputDevice( void ) override; + void closeStream( void ) override; + void startStream( void ) override; + void stopStream( void ) override; + void abortStream( void ) override; // This function is intended for internal use only. It must be // public because it is called by the internal callback handler, // which is not a member of RtAudio. External use of this function - // will most likely produce highly undesireable results! + // will most likely produce highly undesirable results! bool callbackEvent( AudioDeviceID deviceId, const AudioBufferList *inBufferList, const AudioBufferList *outBufferList ); @@ -918,7 +905,7 @@ public: bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, unsigned int firstChannel, unsigned int sampleRate, RtAudioFormat format, unsigned int *bufferSize, - RtAudio::StreamOptions *options ); + RtAudio::StreamOptions *options ) override; static const char* getErrorCode( OSStatus code ); }; @@ -932,18 +919,18 @@ public: RtApiJack(); ~RtApiJack(); - RtAudio::Api getCurrentApi( void ) { return RtAudio::UNIX_JACK; } - unsigned int getDeviceCount( void ); - RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); - void closeStream( void ); - void startStream( void ); - void stopStream( void ); - void abortStream( void ); + RtAudio::Api getCurrentApi( void ) override { return RtAudio::UNIX_JACK; } + unsigned int getDeviceCount( void ) override; + RtAudio::DeviceInfo getDeviceInfo( unsigned int device ) override; + void closeStream( void ) override; + void startStream( void ) override; + void stopStream( void ) override; + void abortStream( void ) override; // This function is intended for internal use only. It must be // public because it is called by the internal callback handler, // which is not a member of RtAudio. External use of this function - // will most likely produce highly undesireable results! + // will most likely produce highly undesirable results! bool callbackEvent( unsigned long nframes ); private: @@ -951,7 +938,7 @@ public: bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, unsigned int firstChannel, unsigned int sampleRate, RtAudioFormat format, unsigned int *bufferSize, - RtAudio::StreamOptions *options ); + RtAudio::StreamOptions *options ) override; bool shouldAutoconnect_; }; @@ -966,18 +953,20 @@ public: RtApiAsio(); ~RtApiAsio(); - RtAudio::Api getCurrentApi( void ) { return RtAudio::WINDOWS_ASIO; } - unsigned int getDeviceCount( void ); - RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); - void closeStream( void ); - void startStream( void ); - void stopStream( void ); - void abortStream( void ); + RtAudio::Api getCurrentApi( void ) override { return RtAudio::WINDOWS_ASIO; } + unsigned int getDeviceCount( void ) override; + unsigned int getDefaultOutputDevice( void ) override; + unsigned int getDefaultInputDevice( void ) override; + RtAudio::DeviceInfo getDeviceInfo( unsigned int device ) override; + void closeStream( void ) override; + void startStream( void ) override; + void stopStream( void ) override; + void abortStream( void ) override; // This function is intended for internal use only. It must be // public because it is called by the internal callback handler, // which is not a member of RtAudio. External use of this function - // will most likely produce highly undesireable results! + // will most likely produce highly undesirable results! bool callbackEvent( long bufferIndex ); private: @@ -988,7 +977,7 @@ public: bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, unsigned int firstChannel, unsigned int sampleRate, RtAudioFormat format, unsigned int *bufferSize, - RtAudio::StreamOptions *options ); + RtAudio::StreamOptions *options ) override; }; #endif @@ -1001,20 +990,20 @@ public: RtApiDs(); ~RtApiDs(); - RtAudio::Api getCurrentApi( void ) { return RtAudio::WINDOWS_DS; } - unsigned int getDeviceCount( void ); - unsigned int getDefaultOutputDevice( void ); - unsigned int getDefaultInputDevice( void ); - RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); - void closeStream( void ); - void startStream( void ); - void stopStream( void ); - void abortStream( void ); + RtAudio::Api getCurrentApi( void ) override { return RtAudio::WINDOWS_DS; } + unsigned int getDeviceCount( void ) override; + unsigned int getDefaultOutputDevice( void ) override; + unsigned int getDefaultInputDevice( void ) override; + RtAudio::DeviceInfo getDeviceInfo( unsigned int device ) override; + void closeStream( void ) override; + void startStream( void ) override; + void stopStream( void ) override; + void abortStream( void ) override; // This function is intended for internal use only. It must be // public because it is called by the internal callback handler, // which is not a member of RtAudio. External use of this function - // will most likely produce highly undesireable results! + // will most likely produce highly undesirable results! void callbackEvent( void ); private: @@ -1026,7 +1015,7 @@ public: bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, unsigned int firstChannel, unsigned int sampleRate, RtAudioFormat format, unsigned int *bufferSize, - RtAudio::StreamOptions *options ); + RtAudio::StreamOptions *options ) override; }; #endif @@ -1041,15 +1030,13 @@ public: RtApiWasapi(); virtual ~RtApiWasapi(); - RtAudio::Api getCurrentApi( void ) { return RtAudio::WINDOWS_WASAPI; } - unsigned int getDeviceCount( void ); - RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); - unsigned int getDefaultOutputDevice( void ); - unsigned int getDefaultInputDevice( void ); - void closeStream( void ); - void startStream( void ); - void stopStream( void ); - void abortStream( void ); + RtAudio::Api getCurrentApi( void ) override { return RtAudio::WINDOWS_WASAPI; } + unsigned int getDeviceCount( void ) override; + RtAudio::DeviceInfo getDeviceInfo( unsigned int device ) override; + void closeStream( void ) override; + void startStream( void ) override; + void stopStream( void ) override; + void abortStream( void ) override; private: bool coInitialized_; @@ -1058,7 +1045,7 @@ private: bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, unsigned int firstChannel, unsigned int sampleRate, RtAudioFormat format, unsigned int* bufferSize, - RtAudio::StreamOptions* options ); + RtAudio::StreamOptions* options ) override; static DWORD WINAPI runWasapiThread( void* wasapiPtr ); static DWORD WINAPI stopWasapiThread( void* wasapiPtr ); @@ -1076,18 +1063,18 @@ public: RtApiAlsa(); ~RtApiAlsa(); - RtAudio::Api getCurrentApi() { return RtAudio::LINUX_ALSA; } - unsigned int getDeviceCount( void ); - RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); - void closeStream( void ); - void startStream( void ); - void stopStream( void ); - void abortStream( void ); + RtAudio::Api getCurrentApi() override { return RtAudio::LINUX_ALSA; } + unsigned int getDeviceCount( void ) override; + RtAudio::DeviceInfo getDeviceInfo( unsigned int device ) override; + void closeStream( void ) override; + void startStream( void ) override; + void stopStream( void ) override; + void abortStream( void ) override; // This function is intended for internal use only. It must be // public because it is called by the internal callback handler, // which is not a member of RtAudio. External use of this function - // will most likely produce highly undesireable results! + // will most likely produce highly undesirable results! void callbackEvent( void ); private: @@ -1097,7 +1084,7 @@ public: bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, unsigned int firstChannel, unsigned int sampleRate, RtAudioFormat format, unsigned int *bufferSize, - RtAudio::StreamOptions *options ); + RtAudio::StreamOptions *options ) override; }; #endif @@ -1108,28 +1095,27 @@ class RtApiPulse: public RtApi { public: ~RtApiPulse(); - RtAudio::Api getCurrentApi() { return RtAudio::LINUX_PULSE; } - unsigned int getDeviceCount( void ); - RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); - void closeStream( void ); - void startStream( void ); - void stopStream( void ); - void abortStream( void ); + RtAudio::Api getCurrentApi() override { return RtAudio::LINUX_PULSE; } + unsigned int getDeviceCount( void ) override; + RtAudio::DeviceInfo getDeviceInfo( unsigned int device ) override; + void closeStream( void ) override; + void startStream( void ) override; + void stopStream( void ) override; + void abortStream( void ) override; // This function is intended for internal use only. It must be // public because it is called by the internal callback handler, // which is not a member of RtAudio. External use of this function - // will most likely produce highly undesireable results! + // will most likely produce highly undesirable results! void callbackEvent( void ); private: - std::vector<RtAudio::DeviceInfo> devices_; - void saveDeviceInfo( void ); + void collectDeviceInfo( void ); bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, unsigned int firstChannel, unsigned int sampleRate, RtAudioFormat format, unsigned int *bufferSize, - RtAudio::StreamOptions *options ); + RtAudio::StreamOptions *options ) override; }; #endif @@ -1142,18 +1128,18 @@ public: RtApiOss(); ~RtApiOss(); - RtAudio::Api getCurrentApi() { return RtAudio::LINUX_OSS; } - unsigned int getDeviceCount( void ); - RtAudio::DeviceInfo getDeviceInfo( unsigned int device ); - void closeStream( void ); - void startStream( void ); - void stopStream( void ); - void abortStream( void ); + RtAudio::Api getCurrentApi() override { return RtAudio::LINUX_OSS; } + unsigned int getDeviceCount( void ) override; + RtAudio::DeviceInfo getDeviceInfo( unsigned int device ) override; + void closeStream( void ) override; + void startStream( void ) override; + void stopStream( void ) override; + void abortStream( void ) override; // This function is intended for internal use only. It must be // public because it is called by the internal callback handler, // which is not a member of RtAudio. External use of this function - // will most likely produce highly undesireable results! + // will most likely produce highly undesirable results! void callbackEvent( void ); private: @@ -1161,7 +1147,7 @@ public: bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels, unsigned int firstChannel, unsigned int sampleRate, RtAudioFormat format, unsigned int *bufferSize, - RtAudio::StreamOptions *options ); + RtAudio::StreamOptions *options ) override; }; #endif @@ -1173,20 +1159,20 @@ class RtApiDummy: public RtApi public: RtApiDummy() { errorText_ = "RtApiDummy: This class provides no functionality."; error( RtAudioError::WARNING ); } - RtAudio::Api getCurrentApi( void ) { return RtAudio::RTAUDIO_DUMMY; } - unsigned int getDeviceCount( void ) { return 0; } - RtAudio::DeviceInfo getDeviceInfo( unsigned int /*device*/ ) { RtAudio::DeviceInfo info; return info; } - void closeStream( void ) {} - void startStream( void ) {} - void stopStream( void ) {} - void abortStream( void ) {} + RtAudio::Api getCurrentApi( void ) override { return RtAudio::RTAUDIO_DUMMY; } + unsigned int getDeviceCount( void ) override { return 0; } + RtAudio::DeviceInfo getDeviceInfo( unsigned int /*device*/ ) override { RtAudio::DeviceInfo info; return info; } + void closeStream( void ) override {} + void startStream( void ) override {} + void stopStream( void ) override {} + void abortStream( void ) override {} private: bool probeDeviceOpen( unsigned int /*device*/, StreamMode /*mode*/, unsigned int /*channels*/, unsigned int /*firstChannel*/, unsigned int /*sampleRate*/, RtAudioFormat /*format*/, unsigned int * /*bufferSize*/, - RtAudio::StreamOptions * /*options*/ ) { return false; } + RtAudio::StreamOptions * /*options*/ ) override { return false; } }; #endif diff --git a/src/rtaudio/RtAudio.os b/src/rtaudio/RtAudio.os index f2dfd26c1a6b2994d015badbc29eeb137ae99ef1..7da86472b3334fa616dd67ddc74050896c89bd0d 100644 GIT binary patch literal 77320 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 SkjoetCZlzrA);WdU;+TO_*UEi literal 114943 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 E0ME=p@&Et; -- GitLab