aboutsummaryrefslogtreecommitdiffstats
path: root/src/media/UAudioCore_Portaudio.pas
diff options
context:
space:
mode:
authortobigun <tobigun@b956fd51-792f-4845-bead-9b4dfca2ff2c>2010-04-30 13:49:10 +0000
committertobigun <tobigun@b956fd51-792f-4845-bead-9b4dfca2ff2c>2010-04-30 13:49:10 +0000
commitc61600bfdda6608feb6a390d20e2e1200afe93f6 (patch)
treec5bd160c48f737e940f2f4e60e583d37d972ca11 /src/media/UAudioCore_Portaudio.pas
parentc75faaea68dd7be35fd56b3caf91483c7eef0611 (diff)
downloadusdx-c61600bfdda6608feb6a390d20e2e1200afe93f6.tar.gz
usdx-c61600bfdda6608feb6a390d20e2e1200afe93f6.tar.xz
usdx-c61600bfdda6608feb6a390d20e2e1200afe93f6.zip
portaudio playback (not used by default) segfault fixed
git-svn-id: svn://svn.code.sf.net/p/ultrastardx/svn/trunk@2321 b956fd51-792f-4845-bead-9b4dfca2ff2c
Diffstat (limited to 'src/media/UAudioCore_Portaudio.pas')
-rw-r--r--src/media/UAudioCore_Portaudio.pas56
1 files changed, 56 insertions, 0 deletions
diff --git a/src/media/UAudioCore_Portaudio.pas b/src/media/UAudioCore_Portaudio.pas
index 1c7e3ef5..c97b5d10 100644
--- a/src/media/UAudioCore_Portaudio.pas
+++ b/src/media/UAudioCore_Portaudio.pas
@@ -40,9 +40,13 @@ uses
type
TAudioCore_Portaudio = class
+ private
+ InitCount: integer; ///< keeps track of the number of Initialize/Terminate calls
public
constructor Create();
class function GetInstance(): TAudioCore_Portaudio;
+ function Initialize(): boolean;
+ function Terminate(): boolean;
function GetPreferredApiIndex(): TPaHostApiIndex;
function TestDevice(inParams, outParams: PPaStreamParameters; var sampleRate: double): boolean;
end;
@@ -92,6 +96,7 @@ var
constructor TAudioCore_Portaudio.Create();
begin
inherited;
+ InitCount := 0;
end;
class function TAudioCore_Portaudio.GetInstance(): TAudioCore_Portaudio;
@@ -101,6 +106,57 @@ begin
Result := Instance;
end;
+function TAudioCore_Portaudio.Initialize(): boolean;
+var
+ Err: TPaError;
+begin
+ // initialize only once
+ if (InitCount > 0) then
+ begin
+ Inc(InitCount);
+ Result := true;
+ Exit;
+ end;
+
+ // init Portaudio
+ Err := Pa_Initialize();
+ if (Err <> paNoError) then
+ begin
+ Log.LogError(Pa_GetErrorText(Err), 'TAudioCore_Portaudio.Initialize');
+ Result := false;
+ Exit;
+ end;
+
+ // only increment on success
+ Inc(InitCount);
+ Result := true;
+end;
+
+function TAudioCore_Portaudio.Terminate(): boolean;
+var
+ Err: TPaError;
+begin
+ // decrement usage count
+ Dec(InitCount);
+ if (InitCount > 0) then
+ begin
+ // do not terminate yet
+ Result := true;
+ Exit;
+ end;
+
+ // terminate if usage count is 0
+ Err := Pa_Terminate();
+ if (Err <> paNoError) then
+ begin
+ Log.LogError(Pa_GetErrorText(Err), 'TAudioCore_Portaudio.Terminate');
+ Result := false;
+ Exit;
+ end;
+
+ Result := true;
+end;
+
function TAudioCore_Portaudio.GetPreferredApiIndex(): TPaHostApiIndex;
var
i: integer;