Change CPortAudioCommon to be static class only to allow inheritance in record and playback classes (later)

This commit is contained in:
Flamefire committed 2014-03-20 20:23:47 +01:00
1 parent 2f1b2d604a
commit 9054f529a0
4 files changed
+39 -57

No files matched your search

+1 -19
View File
@@ -38,9 +38,6 @@ using System.Diagnostics.CodeAnalysis;
[assembly: SuppressMessage("Microsoft.Reliability", "CA2000:Objekte verwerfen, bevor Bereich verloren geht", Scope = "member", Target = "Vocaluxe.Lib.Draw.CDirect3D.#CopyScreen()")
]
[assembly: SuppressMessage("Microsoft.Design", "CA1008:EnumsShouldHaveZeroValue", Scope = "type", Target = "Vocaluxe.Lib.Input.WiiMote.InputReport")]
[assembly: SuppressMessage("Microsoft.Design", "CA1008:EnumsShouldHaveZeroValue", Scope = "type", Target = "PortAudioSharp.PortAudio+PaDeviceIndex")]
[assembly: SuppressMessage("Microsoft.Design", "CA1008:EnumsShouldHaveZeroValue", Scope = "type", Target = "PortAudioSharp.PortAudio+PaSampleFormat")]
[assembly: SuppressMessage("Microsoft.Design", "CA1008:EnumsShouldHaveZeroValue", Scope = "type", Target = "PortAudioSharp.PortAudio+PaStreamCallbackFlags")]
[assembly:
SuppressMessage("Microsoft.Security", "CA2122:DoNotIndirectlyExposeMethodsWithLinkDemands", Scope = "member",
Target = "Vocaluxe.Lib.Video.Gstreamer.CGstreamerVideoWrapper.#GetFrame(System.Int32,System.Single)")]
@@ -49,19 +46,4 @@ using System.Diagnostics.CodeAnalysis;
Target = "Vocaluxe.Lib.Input.CHIDAPI.#ReadTimeout(System.IntPtr,System.Byte[]&,System.Int32,System.Int32)")]
[assembly:
SuppressMessage("Microsoft.Security", "CA2122:DoNotIndirectlyExposeMethodsWithLinkDemands", Scope = "member",
Target = "Vocaluxe.Lib.Input.CHIDAPI.#Read(System.IntPtr,System.Byte[]&,System.Int32)")]
[assembly: SuppressMessage("Microsoft.Security", "CA2122:DoNotIndirectlyExposeMethodsWithLinkDemands", Scope = "member", Target = "PortAudioSharp.PortAudio.#Pa_GetVersionText()")]
[assembly:
SuppressMessage("Microsoft.Security", "CA2122:DoNotIndirectlyExposeMethodsWithLinkDemands", Scope = "member",
Target = "PortAudioSharp.PortAudio.#Pa_GetErrorText(PortAudioSharp.PortAudio+PaError)")]
[assembly:
SuppressMessage("Microsoft.Security", "CA2122:DoNotIndirectlyExposeMethodsWithLinkDemands", Scope = "member",
Target = "PortAudioSharp.PortAudio.#Pa_GetHostApiInfo(System.Int32)")]
[assembly:
SuppressMessage("Microsoft.Security", "CA2122:DoNotIndirectlyExposeMethodsWithLinkDemands", Scope = "member", Target = "PortAudioSharp.PortAudio.#Pa_GetLastHostErrorInfo()")]
[assembly:
SuppressMessage("Microsoft.Security", "CA2122:DoNotIndirectlyExposeMethodsWithLinkDemands", Scope = "member",
Target = "PortAudioSharp.PortAudio.#Pa_GetDeviceInfo(System.Int32)")]
[assembly:
SuppressMessage("Microsoft.Security", "CA2122:DoNotIndirectlyExposeMethodsWithLinkDemands", Scope = "member",
Target = "PortAudioSharp.PortAudio.#Pa_GetStreamInfo(System.IntPtr)")]
Target = "Vocaluxe.Lib.Input.CHIDAPI.#Read(System.IntPtr,System.Byte[]&,System.Int32)")]
+20 -20
View File
@@ -12,7 +12,7 @@ namespace Vocaluxe.Lib.Sound
/// DO NEVER use following Pa_* functions other than the ones from this class:
/// Initialize, Terminate, OpenStream, CloseStream
/// </summary>
abstract class CPortAudioCommon
static class CPortAudioCommon
{
private static int _RefCount;
private static readonly object _Mutex = new object();
@@ -22,13 +22,13 @@ namespace Vocaluxe.Lib.Sound
/// MUST call CloseDriver when done
/// </summary>
/// <returns>True on success, falso if not initialized (log written)</returns>
protected static bool _InitDriver()
public static bool InitDriver()
{
lock (_Mutex)
{
if (_RefCount == 0)
{
if (_CheckError("Initialize", PortAudio.Pa_Initialize()))
if (CheckError("Initialize", PortAudio.Pa_Initialize()))
return false;
}
_RefCount++;
@@ -40,7 +40,7 @@ namespace Vocaluxe.Lib.Sound
/// Safe method to close PortAudio
/// MUST be called _exactly_ once after successfull InitDriver call
/// </summary>
protected static void _CloseDriver()
public static void CloseDriver()
{
lock (_Mutex)
{
@@ -51,9 +51,9 @@ namespace Vocaluxe.Lib.Sound
}
}
protected static PortAudio.PaError _OpenStream(out IntPtr stream, ref PortAudio.PaStreamParameters? inputParameters, ref PortAudio.PaStreamParameters? outputParameters,
double sampleRate, uint framesPerBuffer, PortAudio.PaStreamFlags streamFlags,
PortAudio.PaStreamCallbackDelegate streamCallback, IntPtr userData)
public static PortAudio.PaError OpenStream(out IntPtr stream, ref PortAudio.PaStreamParameters? inputParameters, ref PortAudio.PaStreamParameters? outputParameters,
double sampleRate, uint framesPerBuffer, PortAudio.PaStreamFlags streamFlags,
PortAudio.PaStreamCallbackDelegate streamCallback, IntPtr userData)
{
lock (_Mutex)
{
@@ -72,14 +72,14 @@ namespace Vocaluxe.Lib.Sound
/// <param name="streamCallback"></param>
/// <param name="userData"></param>
/// <returns>True on success</returns>
protected static bool _OpenInputStream(out IntPtr stream, ref PortAudio.PaStreamParameters? inputParameters,
double sampleRate, uint framesPerBuffer, PortAudio.PaStreamFlags streamFlags,
PortAudio.PaStreamCallbackDelegate streamCallback, IntPtr userData)
public static bool OpenInputStream(out IntPtr stream, ref PortAudio.PaStreamParameters? inputParameters,
double sampleRate, uint framesPerBuffer, PortAudio.PaStreamFlags streamFlags,
PortAudio.PaStreamCallbackDelegate streamCallback, IntPtr userData)
{
PortAudio.PaStreamParameters? outputParameters = null;
return
!_CheckError("OpenInputStream",
_OpenStream(out stream, ref inputParameters, ref outputParameters, sampleRate, framesPerBuffer, streamFlags, streamCallback, userData));
!CheckError("OpenInputStream",
OpenStream(out stream, ref inputParameters, ref outputParameters, sampleRate, framesPerBuffer, streamFlags, streamCallback, userData));
}
/// <summary>
@@ -93,17 +93,17 @@ namespace Vocaluxe.Lib.Sound
/// <param name="streamCallback"></param>
/// <param name="userData"></param>
/// <returns>True on success</returns>
protected static bool _OpenOutputStream(out IntPtr stream, ref PortAudio.PaStreamParameters? outputParameters,
double sampleRate, uint framesPerBuffer, PortAudio.PaStreamFlags streamFlags,
PortAudio.PaStreamCallbackDelegate streamCallback, IntPtr userData)
public static bool OpenOutputStream(out IntPtr stream, ref PortAudio.PaStreamParameters? outputParameters,
double sampleRate, uint framesPerBuffer, PortAudio.PaStreamFlags streamFlags,
PortAudio.PaStreamCallbackDelegate streamCallback, IntPtr userData)
{
PortAudio.PaStreamParameters? inputParameters = null;
return
!_CheckError("OpenOutputStream",
_OpenStream(out stream, ref inputParameters, ref outputParameters, sampleRate, framesPerBuffer, streamFlags, streamCallback, userData));
!CheckError("OpenOutputStream",
OpenStream(out stream, ref inputParameters, ref outputParameters, sampleRate, framesPerBuffer, streamFlags, streamCallback, userData));
}
protected static void _CloseStream(IntPtr stream)
public static void CloseStream(IntPtr stream)
{
lock (_Mutex)
{
@@ -118,7 +118,7 @@ namespace Vocaluxe.Lib.Sound
/// <param name="action">Action identifier (E.g. openStream)</param>
/// <param name="errorCode">Result returned by Pa_* call</param>
/// <returns>True on error</returns>
protected static bool _CheckError(String action, PortAudio.PaError errorCode)
public static bool CheckError(String action, PortAudio.PaError errorCode)
{
if (errorCode != PortAudio.PaError.paNoError)
{
@@ -140,7 +140,7 @@ namespace Vocaluxe.Lib.Sound
/// Selects the most appropriate host api
/// </summary>
/// <returns>The most appropriate host api</returns>
protected static int _GetHostApi()
public static int GetHostApi()
{
//Caller has to hold a reference anyway so no locking needed
if (_RefCount < 1)
@@ -8,7 +8,7 @@ using VocaluxeLib;
namespace Vocaluxe.Lib.Sound.Playback.PortAudio
{
class CPortAudioStream : CPortAudioCommon, IDisposable
class CPortAudioStream : IDisposable
{
private const long _Bufsize = 1000000L;
private const long _Beginrefill = 800000L;
@@ -187,12 +187,12 @@ namespace Vocaluxe.Lib.Sound.Playback.PortAudio
{
Paused = false;
_AfterFadeAction = EStreamAction.Nothing;
_CheckError("StartStream", PortAudioSharp.PortAudio.Pa_StartStream(_Stream));
CPortAudioCommon.CheckError("StartStream", PortAudioSharp.PortAudio.Pa_StartStream(_Stream));
}
public void Stop()
{
_CheckError("StopStream (playback)", PortAudioSharp.PortAudio.Pa_StopStream(_Stream));
CPortAudioCommon.CheckError("StopStream (playback)", PortAudioSharp.PortAudio.Pa_StopStream(_Stream));
Skip(0f);
}
@@ -213,11 +213,11 @@ namespace Vocaluxe.Lib.Sound.Playback.PortAudio
bool driverInitialized = false;
try
{
if (!_InitDriver())
if (!CPortAudioCommon.InitDriver())
return false;
driverInitialized = true;
int hostApi = _GetHostApi();
int hostApi = CPortAudioCommon.GetHostApi();
_ApiInfo = PortAudioSharp.PortAudio.Pa_GetHostApiInfo(hostApi);
_OutputDeviceInfo = PortAudioSharp.PortAudio.Pa_GetDeviceInfo(_ApiInfo.defaultOutputDevice);
if (_OutputDeviceInfo.defaultLowOutputLatency < 0.1)
@@ -228,7 +228,7 @@ namespace Vocaluxe.Lib.Sound.Playback.PortAudio
catch (Exception)
{
if (driverInitialized)
_CloseDriver();
CPortAudioCommon.CloseDriver();
CLog.LogError("Error Init PortAudio Playback");
return false;
}
@@ -240,7 +240,7 @@ namespace Vocaluxe.Lib.Sound.Playback.PortAudio
SFormatInfo format = _Decoder.GetFormatInfo();
if (format.SamplesPerSecond == 0)
{
_CloseDriver();
CPortAudioCommon.CloseDriver();
_Decoder.Close();
_Decoder = null;
CLog.LogError("Error Init PortAudio Playback (samples=0)");
@@ -262,7 +262,7 @@ namespace Vocaluxe.Lib.Sound.Playback.PortAudio
hostApiSpecificStreamInfo = IntPtr.Zero
};
if (!_OpenOutputStream(
if (!CPortAudioCommon.OpenOutputStream(
out _Stream,
ref outputParams,
format.SamplesPerSecond,
@@ -271,7 +271,7 @@ namespace Vocaluxe.Lib.Sound.Playback.PortAudio
_PaStreamCallback,
IntPtr.Zero) || _Stream == IntPtr.Zero)
{
_CloseDriver();
CPortAudioCommon.CloseDriver();
_Decoder.Close();
_Decoder = null;
return false;
@@ -410,8 +410,8 @@ namespace Vocaluxe.Lib.Sound.Playback.PortAudio
private void _DoFree()
{
_CloseStream(_Stream);
_CloseDriver();
CPortAudioCommon.CloseStream(_Stream);
CPortAudioCommon.CloseDriver();
_Decoder.Close();
_Closeproc(ID);
@@ -24,7 +24,7 @@ using Vocaluxe.Base;
namespace Vocaluxe.Lib.Sound.Record.PortAudio
{
class CPortAudioRecord : CPortAudioCommon, IRecord
class CPortAudioRecord : IRecord
{
private bool _Initialized;
private readonly List<CRecordDevice> _Devices = new List<CRecordDevice>();
@@ -52,11 +52,11 @@ namespace Vocaluxe.Lib.Sound.Record.PortAudio
try
{
if (!_InitDriver())
if (!CPortAudioCommon.InitDriver())
return false;
_Devices.Clear();
int hostAPI = _GetHostApi();
int hostAPI = CPortAudioCommon.GetHostApi();
int numDevices = PortAudioSharp.PortAudio.Pa_GetDeviceCount();
for (int i = 0; i < numDevices; i++)
{
@@ -128,7 +128,7 @@ namespace Vocaluxe.Lib.Sound.Record.PortAudio
suggestedLatency = PortAudioSharp.PortAudio.Pa_GetDeviceInfo(_Devices[dev].ID).defaultLowInputLatency,
hostApiSpecificStreamInfo = IntPtr.Zero
};
if (!_OpenInputStream(
if (!CPortAudioCommon.OpenInputStream(
out _RecHandle[dev],
ref inputParams,
44100,
@@ -138,7 +138,7 @@ namespace Vocaluxe.Lib.Sound.Record.PortAudio
new IntPtr(dev)))
return false;
if (_CheckError("Start Stream (rec)", PortAudioSharp.PortAudio.Pa_StartStream(_RecHandle[dev])))
if (CPortAudioCommon.CheckError("Start Stream (rec)", PortAudioSharp.PortAudio.Pa_StartStream(_RecHandle[dev])))
return false;
}
}
@@ -168,8 +168,8 @@ namespace Vocaluxe.Lib.Sound.Record.PortAudio
return;
foreach (IntPtr handle in _RecHandle)
_CloseStream(handle);
_CloseDriver();
CPortAudioCommon.CloseStream(handle);
CPortAudioCommon.CloseDriver();
_Initialized = false;