blob: 952b211b49baef6e7ae7aeef407d7fa422eb84ea (
plain) (
tree)
|
|
unit UAudioCore_Portaudio;
interface
{$IFDEF FPC}
{$MODE Delphi}
{$ENDIF}
{$I ../switches.inc}
uses
Classes,
SysUtils,
portaudio;
type
TAudioCore_Portaudio = class
public
class function GetPreferredApiIndex(): TPaHostApiIndex;
end;
implementation
uses
ULog;
{*
* The default API used by Portaudio is the least common denominator
* and might lack efficiency. In addition it might not even work.
* We use an array named ApiPreferenceOrder with which we define the order of
* preferred APIs to use. The first API-type in the list is tried first.
* If it is not available the next one is tried and so on ...
* If none of the preferred APIs was found the default API (detected by
* portaudio) is used.
*
* Pascal does not permit zero-length static arrays, so you must use paDefaultApi
* as an array's only member if you do not have any preferences.
* You can also append paDefaultApi to a non-zero length preferences array but
* this is optional because the default API is always used as a fallback.
*}
const
paDefaultApi = -1;
const
ApiPreferenceOrder:
{$IF Defined(MSWINDOWS)}
// Note1: Portmixer has no mixer support for paASIO and paWASAPI at the moment
// Note2: Windows Default-API is MME, but DirectSound is faster
array[0..0] of TPaHostApiTypeId = ( paDirectSound );
{$ELSEIF Defined(LINUX)}
// Note: Portmixer has no mixer support for JACK at the moment
array[0..2] of TPaHostApiTypeId = ( paALSA, paJACK, paOSS );
{$ELSEIF Defined(DARWIN)}
array[0..0] of TPaHostApiTypeId = ( paDefaultApi ); // paCoreAudio
{$ELSE}
array[0..0] of TPaHostApiTypeId = ( paDefaultApi );
{$IFEND}
{ TAudioInput_Portaudio }
class function TAudioCore_Portaudio.GetPreferredApiIndex(): TPaHostApiIndex;
var
i: integer;
apiIndex: TPaHostApiIndex;
apiInfo: PPaHostApiInfo;
begin
result := -1;
// select preferred sound-API
for i:= 0 to High(ApiPreferenceOrder) do
begin
if(ApiPreferenceOrder[i] <> paDefaultApi) then
begin
// check if API is available
apiIndex := Pa_HostApiTypeIdToHostApiIndex(ApiPreferenceOrder[i]);
if(apiIndex >= 0) then
begin
// we found an API but we must check if it works
// (on linux portaudio might detect OSS but does not provide
// any devices if ALSA is enabled)
apiInfo := Pa_GetHostApiInfo(apiIndex);
if (apiInfo^.deviceCount > 0) then
begin
Result := apiIndex;
break;
end;
end;
end;
end;
// None of the preferred APIs is available -> use default
if(result < 0) then
begin
result := Pa_GetDefaultHostApi();
end;
end;
end.
|