From 5316d30a7df06d1bba38e225bc39c815a7cfbe0c Mon Sep 17 00:00:00 2001 From: Flamefire Date: Sat, 15 Mar 2014 17:15:13 +0100 Subject: [PATCH] Use PortAudio-Sharp bindings for easier updates Use COSFunctions for OS-specific stuff Add dll directories on startup (could be done in the modules itself, but this way it avoids all trouble) --- Output/PortAudioSharp.dll | Bin 0 -> 49152 bytes Output/PortAudioSharp.dll.config | 4 + .../x64/{portaudio_x64.dll => PortAudio.dll} | Bin .../x86/{portaudio_x86.dll => PortAudio.dll} | Bin Vocaluxe/COSFunctions.cs | 89 +++ Vocaluxe/CProgrammHelper.cs | 15 + .../GstreamerSharp/CGstreamerSharpAudio.cs | 5 +- .../Playback/PortAudio/CPortAudioStream.cs | 80 +-- Vocaluxe/Lib/Sound/Portaudio/PortAudio.cs | 558 ------------------ .../Record/PortAudio/CPortAudioRecord.cs | 73 ++- Vocaluxe/Program.cs | 16 +- Vocaluxe/Vocaluxe.csproj | 6 +- 12 files changed, 196 insertions(+), 650 deletions(-) create mode 100644 Output/PortAudioSharp.dll create mode 100644 Output/PortAudioSharp.dll.config rename Output/x64/{portaudio_x64.dll => PortAudio.dll} (100%) rename Output/x86/{portaudio_x86.dll => PortAudio.dll} (100%) create mode 100644 Vocaluxe/COSFunctions.cs delete mode 100644 Vocaluxe/Lib/Sound/Portaudio/PortAudio.cs diff --git a/Output/PortAudioSharp.dll b/Output/PortAudioSharp.dll new file mode 100644 index 0000000000000000000000000000000000000000..f48cfc2ac62c98556e0b1361c698e74543b6606b GIT binary patch literal 49152 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 lDGN+lV9Ekh7MQZYlm(_NFlB)$3rtyH$^ugs_ + + + \ No newline at end of file diff --git a/Output/x64/portaudio_x64.dll b/Output/x64/PortAudio.dll similarity index 100% rename from Output/x64/portaudio_x64.dll rename to Output/x64/PortAudio.dll diff --git a/Output/x86/portaudio_x86.dll b/Output/x86/PortAudio.dll similarity index 100% rename from Output/x86/portaudio_x86.dll rename to Output/x86/PortAudio.dll diff --git a/Vocaluxe/COSFunctions.cs b/Vocaluxe/COSFunctions.cs new file mode 100644 index 00000000..c72b6c46 --- /dev/null +++ b/Vocaluxe/COSFunctions.cs @@ -0,0 +1,89 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; + +namespace Vocaluxe +{ + static class COSFunctions + { +#if WIN + private static bool _DefaultDllDirSet; + private static bool _UsePath; + private static bool _UseSetDllDir; + + private static class CWindowsFunctions + { + [DllImport("kernel32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] + public static extern void AddDllDirectory(string lpPathName); + + [DllImport("kernel32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)] + public static extern void SetDllDirectory(string lpPathName); + + [DllImport("user32.dll", CallingConvention = CallingConvention.StdCall)] + [return: MarshalAs(UnmanagedType.Bool)] + public static extern bool SetForegroundWindow(IntPtr hWnd); + + [DllImport("user32.dll", CallingConvention = CallingConvention.StdCall)] + [return: MarshalAs(UnmanagedType.Bool)] + public static extern bool SetDefaultDllDirectories(int directoryFlags); + + // ReSharper disable InconsistentNaming + public const int LOAD_LIBRARY_SEARCH_DEFAULT_DIRS = 0x00001000; + // ReSharper restore InconsistentNaming + } +#endif + + public static void AddEnvironmentPath(string path) + { + string newPath = Environment.GetEnvironmentVariable("PATH") ?? string.Empty; + if (newPath.Length > 0) + newPath += ";"; + newPath += path; + + Environment.SetEnvironmentVariable("PATH", newPath); + } + + public static void AddLibrarySearchpath(string path) + { +#if WIN + if (!_DefaultDllDirSet) + { + try + { + CWindowsFunctions.SetDefaultDllDirectories(CWindowsFunctions.LOAD_LIBRARY_SEARCH_DEFAULT_DIRS); + } + catch (Exception) + { + _UsePath = true; + _UseSetDllDir = true; + } + _DefaultDllDirSet = true; + } + if (_UsePath) + AddEnvironmentPath(path); + if (!_UseSetDllDir) + { + try + { + CWindowsFunctions.AddDllDirectory(path); + } + catch (Exception) + { + _UseSetDllDir = true; + } + } + if (_UseSetDllDir) + CWindowsFunctions.SetDllDirectory(path); +#endif + } + + public static void SetForegroundWindow(IntPtr hWnd) + { +#if WIN + CWindowsFunctions.SetForegroundWindow(hWnd); +#endif + } + } +} \ No newline at end of file diff --git a/Vocaluxe/CProgrammHelper.cs b/Vocaluxe/CProgrammHelper.cs index f4425776..7140589e 100644 --- a/Vocaluxe/CProgrammHelper.cs +++ b/Vocaluxe/CProgrammHelper.cs @@ -17,6 +17,8 @@ using System; using System.IO; +using System.Reflection; +using System.Runtime.InteropServices; using System.Security; using Microsoft.Win32; using Vocaluxe.Base; @@ -108,5 +110,18 @@ namespace Vocaluxe } return true; } + + public static void Init() + { +#if ARCH_X86 + string path = "x86"; +#endif +#if ARCH_X64 + string path = "x64"; +#endif + path = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location) + Path.DirectorySeparatorChar + path; + COSFunctions.AddLibrarySearchpath(path); + COSFunctions.AddLibrarySearchpath(path + Path.DirectorySeparatorChar + "gstreamer"); + } } } \ No newline at end of file diff --git a/Vocaluxe/Lib/Sound/Playback/GstreamerSharp/CGstreamerSharpAudio.cs b/Vocaluxe/Lib/Sound/Playback/GstreamerSharp/CGstreamerSharpAudio.cs index 8125038f..239edf7b 100644 --- a/Vocaluxe/Lib/Sound/Playback/GstreamerSharp/CGstreamerSharpAudio.cs +++ b/Vocaluxe/Lib/Sound/Playback/GstreamerSharp/CGstreamerSharpAudio.cs @@ -26,9 +26,6 @@ namespace Vocaluxe.Lib.Sound.Playback.GstreamerSharp private readonly Dictionary _Streams = new Dictionary(); private static int _IDCount; - [DllImport("kernel32.dll", CharSet = CharSet.Auto)] - private static extern void SetDllDirectory(string lpPathName); - public bool Init() { #if ARCH_X86 @@ -37,7 +34,7 @@ namespace Vocaluxe.Lib.Sound.Playback.GstreamerSharp #if ARCH_X64 const string path = ".\\x64\\gstreamer"; #endif - SetDllDirectory(path); + //SetDllDirectory(path); Application.Init(); Registry reg = Registry.Get(); reg.ScanPath(path); diff --git a/Vocaluxe/Lib/Sound/Playback/PortAudio/CPortAudioStream.cs b/Vocaluxe/Lib/Sound/Playback/PortAudio/CPortAudioStream.cs index bf603b6d..48ee8776 100644 --- a/Vocaluxe/Lib/Sound/Playback/PortAudio/CPortAudioStream.cs +++ b/Vocaluxe/Lib/Sound/Playback/PortAudio/CPortAudioStream.cs @@ -4,7 +4,6 @@ using System.Runtime.InteropServices; using System.Threading; using Vocaluxe.Base; using Vocaluxe.Lib.Sound.Playback.Decoder; -using Vocaluxe.Lib.Sound.PortAudio; using VocaluxeLib; namespace Vocaluxe.Lib.Sound.Playback.PortAudio @@ -25,12 +24,12 @@ namespace Vocaluxe.Lib.Sound.Playback.PortAudio private EStreamAction _AfterFadeAction; private CFading _Fading; - private static CPortAudio.SPaHostApiInfo _ApiInfo; - private static CPortAudio.SPaDeviceInfo _OutputDeviceInfo; + private static PortAudioSharp.PortAudio.PaHostApiInfo _ApiInfo; + private static PortAudioSharp.PortAudio.PaDeviceInfo _OutputDeviceInfo; private IntPtr _Ptr = new IntPtr(0); private Closeproc _Closeproc; - private CPortAudio.PaStreamCallbackDelegate _PaStreamCallback; + private PortAudioSharp.PortAudio.PaStreamCallbackDelegate _PaStreamCallback; private int _StreamID; private IAudioDecoder _Decoder; private float _BytesPerSecond; @@ -202,7 +201,7 @@ namespace Vocaluxe.Lib.Sound.Playback.PortAudio _AfterFadeAction = EStreamAction.Nothing; lock (_Mutex) { - _ErrorCheck("StartStream", CPortAudio.Pa_StartStream(_Ptr)); + _ErrorCheck("StartStream", PortAudioSharp.PortAudio.Pa_StartStream(_Ptr)); } } @@ -210,7 +209,7 @@ namespace Vocaluxe.Lib.Sound.Playback.PortAudio { lock (_Mutex) { - _ErrorCheck("StopStream (playback)", CPortAudio.Pa_StopStream(_Ptr)); + _ErrorCheck("StopStream (playback)", PortAudioSharp.PortAudio.Pa_StopStream(_Ptr)); } Skip(0f); } @@ -241,15 +240,15 @@ namespace Vocaluxe.Lib.Sound.Playback.PortAudio { if (!_Initialized) { - if (_ErrorCheck("Initialize", CPortAudio.Pa_Initialize())) + if (_ErrorCheck("Initialize", PortAudioSharp.PortAudio.Pa_Initialize())) return -1; _Initialized = true; int hostApi = _ApiSelect(); - _ApiInfo = CPortAudio.PaGetHostApiInfo(hostApi); - _OutputDeviceInfo = CPortAudio.PaGetDeviceInfo(_ApiInfo.DefaultOutputDevice); - if (_OutputDeviceInfo.DefaultLowOutputLatency < 0.1) - _OutputDeviceInfo.DefaultLowOutputLatency = 0.1; + _ApiInfo = PortAudioSharp.PortAudio.Pa_GetHostApiInfo(hostApi); + _OutputDeviceInfo = PortAudioSharp.PortAudio.Pa_GetDeviceInfo(_ApiInfo.defaultOutputDevice); + if (_OutputDeviceInfo.defaultLowOutputLatency < 0.1) + _OutputDeviceInfo.defaultLowOutputLatency = 0.1; } } @@ -278,24 +277,25 @@ namespace Vocaluxe.Lib.Sound.Playback.PortAudio var data = new IntPtr(0); - var outputParams = new CPortAudio.SPaStreamParameters + PortAudioSharp.PortAudio.PaStreamParameters? outputParams = new PortAudioSharp.PortAudio.PaStreamParameters { - ChannelCount = format.ChannelCount, - Device = _ApiInfo.DefaultOutputDevice, - SampleFormat = CPortAudio.EPaSampleFormat.PaInt16, - SuggestedLatency = _OutputDeviceInfo.DefaultLowOutputLatency + channelCount = format.ChannelCount, + device = _ApiInfo.defaultOutputDevice, + sampleFormat = PortAudioSharp.PortAudio.PaSampleFormat.paInt16, + suggestedLatency = _OutputDeviceInfo.defaultLowOutputLatency }; + PortAudioSharp.PortAudio.PaStreamParameters? inputParams = null; var bufsize = (uint)CConfig.AudioBufferSize; lock (_Mutex) { - _ErrorCheck("OpenDefaultStream (playback)", CPortAudio.Pa_OpenStream( + _ErrorCheck("OpenDefaultStream (playback)", PortAudioSharp.PortAudio.Pa_OpenStream( out _Ptr, - IntPtr.Zero, + ref inputParams, ref outputParams, format.SamplesPerSecond, bufsize, - CPortAudio.EPaStreamFlags.PaNoFlag, + PortAudioSharp.PortAudio.PaStreamFlags.paNoFlag, _PaStreamCallback, data)); } @@ -450,7 +450,7 @@ namespace Vocaluxe.Lib.Sound.Playback.PortAudio { lock (_Mutex) { - CPortAudio.Pa_Terminate(); + PortAudioSharp.PortAudio.Pa_Terminate(); _Initialized = false; } } @@ -462,12 +462,12 @@ namespace Vocaluxe.Lib.Sound.Playback.PortAudio #endregion Threading #region Callbacks - private CPortAudio.EPaStreamCallbackResult _ProcessNewData( + private PortAudioSharp.PortAudio.PaStreamCallbackResult _ProcessNewData( IntPtr input, IntPtr output, uint frameCount, - ref CPortAudio.SPaStreamCallbackTimeInfo timeInfo, - CPortAudio.EPaStreamCallbackFlags statusFlags, + ref PortAudioSharp.PortAudio.PaStreamCallbackTimeInfo timeInfo, + PortAudioSharp.PortAudio.PaStreamCallbackFlags statusFlags, IntPtr userData) { var buf = new byte[frameCount * _ByteCount]; @@ -482,7 +482,7 @@ namespace Vocaluxe.Lib.Sound.Playback.PortAudio { Console.WriteLine(e.ToString()); } - return CPortAudio.EPaStreamCallbackResult.PaContinue; + return PortAudioSharp.PortAudio.PaStreamCallbackResult.paContinue; } lock (_LockData) @@ -534,27 +534,27 @@ namespace Vocaluxe.Lib.Sound.Playback.PortAudio } catch (Exception e) { - CLog.LogError("Error PortAudio.StreamCallback: " + e.Message); + CLog.LogError("Error PortAudio.treamCallback: " + e.Message); } - return CPortAudio.EPaStreamCallbackResult.PaContinue; + return PortAudioSharp.PortAudio.PaStreamCallbackResult.paContinue; } #endregion Callbacks - private bool _ErrorCheck(String action, CPortAudio.EPaError errorCode) + private bool _ErrorCheck(String action, PortAudioSharp.PortAudio.PaError errorCode) { - if (errorCode != CPortAudio.EPaError.PaNoError) + if (errorCode != PortAudioSharp.PortAudio.PaError.paNoError) { - if (errorCode == CPortAudio.EPaError.PaStreamIsNotStopped) + if (errorCode == PortAudioSharp.PortAudio.PaError.paStreamIsNotStopped) return false; - CLog.LogError(action + " error (playback): " + CPortAudio.PaGetErrorText(errorCode)); - if (errorCode == CPortAudio.EPaError.PaUnanticipatedHostError) + CLog.LogError(action + " error (playback): " + PortAudioSharp.PortAudio.Pa_GetErrorText(errorCode)); + if (errorCode == PortAudioSharp.PortAudio.PaError.paUnanticipatedHostError) { - CPortAudio.SPaHostErrorInfo errorInfo = CPortAudio.PaGetLastHostErrorInfo(); - CLog.LogError("- Host error API type: " + errorInfo.HostApiType); - CLog.LogError("- Host error code: " + errorInfo.ErrorCode); - CLog.LogError("- Host error text: " + errorInfo.ErrorText); + PortAudioSharp.PortAudio.PaHostErrorInfo errorInfo = PortAudioSharp.PortAudio.Pa_GetLastHostErrorInfo(); + CLog.LogError("- Host error API type: " + errorInfo.hostApiType); + CLog.LogError("- Host error code: " + errorInfo.errorCode); + CLog.LogError("- Host error text: " + errorInfo.errorText); } return true; } @@ -567,13 +567,13 @@ namespace Vocaluxe.Lib.Sound.Playback.PortAudio if (!_Initialized) return 0; - int selectedHostApi = CPortAudio.Pa_GetDefaultHostApi(); - int apiCount = CPortAudio.Pa_GetHostApiCount(); + int selectedHostApi = PortAudioSharp.PortAudio.Pa_GetDefaultHostApi(); + int apiCount = PortAudioSharp.PortAudio.Pa_GetHostApiCount(); for (int i = 0; i < apiCount; i++) { - CPortAudio.SPaHostApiInfo apiInfo = CPortAudio.PaGetHostApiInfo(i); - if ((apiInfo.Type == CPortAudio.EPaHostApiTypeId.PaDirectSound) - || (apiInfo.Type == CPortAudio.EPaHostApiTypeId.PaALSA)) + PortAudioSharp.PortAudio.PaHostApiInfo apiInfo = PortAudioSharp.PortAudio.Pa_GetHostApiInfo(i); + if ((apiInfo.type == PortAudioSharp.PortAudio.PaHostApiTypeId.paDirectSound) + || (apiInfo.type == PortAudioSharp.PortAudio.PaHostApiTypeId.paALSA)) selectedHostApi = i; } return selectedHostApi; diff --git a/Vocaluxe/Lib/Sound/Portaudio/PortAudio.cs b/Vocaluxe/Lib/Sound/Portaudio/PortAudio.cs deleted file mode 100644 index d8c6c9f5..00000000 --- a/Vocaluxe/Lib/Sound/Portaudio/PortAudio.cs +++ /dev/null @@ -1,558 +0,0 @@ -#region license -// This file is part of Vocaluxe. -// -// Vocaluxe is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// Vocaluxe is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with Vocaluxe. If not, see . -#endregion - -using System; -using System.Runtime.InteropServices; - -namespace Vocaluxe.Lib.Sound.PortAudio -{ - /** - - PortAudio v.19 bindings for .NET - - */ - // ReSharper disable UnusedMember.Global - // ReSharper disable FieldCanBeMadeReadOnly.Global - // ReSharper disable MemberCanBePrivate.Global - - public static class CPortAudio - { - #region **** PORTAUDIO CALLBACKS **** - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - public delegate EPaStreamCallbackResult PaStreamCallbackDelegate( - IntPtr input, - IntPtr output, - uint frameCount, - ref SPaStreamCallbackTimeInfo timeInfo, - EPaStreamCallbackFlags statusFlags, - IntPtr userData); - - [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - public delegate void PaStreamFinishedCallbackDelegate(IntPtr userData); - #endregion - - #region **** PORTAUDIO DATA STRUCTURES **** - [StructLayout(LayoutKind.Sequential)] - public struct SPaDeviceInfo - { - public int StructVersion; - [MarshalAs(UnmanagedType.LPStr)] public string Name; - public int HostApi; - public int MaxInputChannels; - public int MaxOutputChannels; - public double DefaultLowInputLatency; - public double DefaultLowOutputLatency; - public double DefaultHighInputLatency; - public double DefaultHighOutputLatency; - public double DefaultSampleRate; - - public override string ToString() - { - return "[" + GetType().Name + "]" + "\n" - + "name: " + Name + "\n" - + "hostApi: " + HostApi + "\n" - + "maxInputChannels: " + MaxInputChannels + "\n" - + "maxOutputChannels: " + MaxOutputChannels + "\n" - + "defaultLowInputLatency: " + DefaultLowInputLatency + "\n" - + "defaultLowOutputLatency: " + DefaultLowOutputLatency + "\n" - + "defaultHighInputLatency: " + DefaultHighInputLatency + "\n" - + "defaultHighOutputLatency: " + DefaultHighOutputLatency + "\n" - + "defaultSampleRate: " + DefaultSampleRate; - } - } - - [StructLayout(LayoutKind.Sequential)] - public struct SPaHostApiInfo - { - public int StructVersion; - public EPaHostApiTypeId Type; - [MarshalAs(UnmanagedType.LPStr)] public string Name; - public int DeviceCount; - public int DefaultInputDevice; - public int DefaultOutputDevice; - - public override string ToString() - { - return "[" + GetType().Name + "]" + "\n" - + "structVersion: " + StructVersion + "\n" - + "type: " + Type + "\n" - + "name: " + Name + "\n" - + "deviceCount: " + DeviceCount + "\n" - + "defaultInputDevice: " + DefaultInputDevice + "\n" - + "defaultOutputDevice: " + DefaultOutputDevice; - } - } - - [StructLayout(LayoutKind.Sequential)] - public struct SPaHostErrorInfo - { - public EPaHostApiTypeId HostApiType; - public int ErrorCode; - [MarshalAs(UnmanagedType.LPStr)] public string ErrorText; - - public override string ToString() - { - return "[" + GetType().Name + "]" + "\n" - + "hostApiType: " + HostApiType + "\n" - + "errorCode: " + ErrorCode + "\n" - + "errorText: " + ErrorText; - } - } - - [StructLayout(LayoutKind.Sequential)] - public struct SPaStreamCallbackTimeInfo - { - public double InputBufferAdcTime; - public double CurrentTime; - public double OutputBufferDacTime; - - public override string ToString() - { - return "[" + GetType().Name + "]" + "\n" - + "currentTime: " + CurrentTime + "\n" - + "inputBufferAdcTime: " + InputBufferAdcTime + "\n" - + "outputBufferDacTime: " + OutputBufferDacTime; - } - } - - [StructLayout(LayoutKind.Sequential)] - public struct SPaStreamInfo - { - public int StructVersion; - public double InputLatency; - public double OutputLatency; - public double SampleRate; - - public override string ToString() - { - return "[" + GetType().Name + "]" + "\n" - + "structVersion: " + StructVersion + "\n" - + "inputLatency: " + InputLatency + "\n" - + "outputLatency: " + OutputLatency + "\n" - + "sampleRate: " + SampleRate; - } - } - - [StructLayout(LayoutKind.Sequential)] - public struct SPaStreamParameters - { - public int Device; - public int ChannelCount; - public EPaSampleFormat SampleFormat; - public double SuggestedLatency; - internal IntPtr HostApiSpecificStreamInfo; - - public override string ToString() - { - return "[" + GetType().Name + "]" + "\n" - + "device: " + Device + "\n" - + "channelCount: " + ChannelCount + "\n" - + "sampleFormat: " + SampleFormat + "\n" - + "suggestedLatency: " + SuggestedLatency; - } - } - #endregion - - #region **** PORTAUDIO DEFINES **** - public enum EPaDeviceIndex - { - PaNoDevice = -1, - PaUseHostApiSpecificDeviceSpecification = -2 - } - - public enum EPaSampleFormat : uint - { - PaFloat32 = 0x00000001, - PaInt32 = 0x00000002, - PaInt24 = 0x00000004, - PaInt16 = 0x00000008, - PaInt8 = 0x00000010, - PaUInt8 = 0x00000020, - PaCustomFormat = 0x00010000, - PaNonInterleaved = 0x80000000, - } - - public const int PaFormatIsSupported = 0; - public const int PaFramesPerBufferUnspecified = 0; - - public enum EPaStreamFlags : uint - { - PaNoFlag = 0, - PaClipOff = 0x00000001, - PaDitherOff = 0x00000002, - PaNeverDropInput = 0x00000004, - PaPrimeOutputBuffersUsingStreamCallback = 0x00000008, - PaPlatformSpecificFlags = 0xFFFF0000 - } - - public enum EPaStreamCallbackFlags : uint - { - PaInputUnderflow = 0x00000001, - PaInputOverflow = 0x00000002, - PaOutputUnderflow = 0x00000004, - PaOutputOverflow = 0x00000008, - PaPrimingOutput = 0x00000010 - } - #endregion - - #region **** PORTAUDIO ENUMERATIONS **** - public enum EPaError - { - PaNoError = 0, - PaNotInitialized = -10000, - PaUnanticipatedHostError, - PaInvalidChannelCount, - PaInvalidSampleRate, - PaInvalidDevice, - PaInvalidFlag, - PaSampleFormatNotSupported, - PaBadIODeviceCombination, - PaInsufficientMemory, - PaBufferTooBig, - PaBufferTooSmall, - PaNullCallback, - PaBadStreamPtr, - PaTimedOut, - PaInternalError, - PaDeviceUnavailable, - PaIncompatibleHostApiSpecificStreamInfo, - PaStreamIsStopped, - PaStreamIsNotStopped, - PaInputOverflowed, - PaOutputUnderflowed, - PaHostApiNotFound, - PaInvalidHostApi, - PaCanNotReadFromCallbackStream, - PaCanNotWriteToACallbackStream, - PaCanNotReadFromAnOutputOnlyStream, - PaCanNotWriteToAnInputOnlyStream, - PaIncompatibleStreamHostApi, - PaBadBufferPtr - } - - public enum EPaHostApiTypeId : uint - { - PaInDevelopment = 0, - PaDirectSound = 1, - PaMME = 2, - PaASIO = 3, - PaSoundManager = 4, - PaCoreAudio = 5, - PaOSS = 7, - PaALSA = 8, - PaAL = 9, - PaBeOS = 10, - PaWDMKS = 11, - PaJACK = 12, - PaWASAPI = 13, - PaAudioScienceHPI = 14 - } - - public enum EPaStreamCallbackResult : uint - { - PaContinue = 0, - PaComplete = 1, - PaAbort = 2 - } - #endregion - - #region **** PORTAUDIO FUNCTIONS **** -#if ARCH_X86 -#if WIN - private const string _PaDll = "x86\\portaudio_x86.dll"; -#endif - -#if LINUX - private const string _PaDll = "libportaudio.so.2.0.0"; -#endif -#endif - -#if ARCH_X64 -#if WIN - private const string _PaDll = "x64\\portaudio_x64.dll"; -#endif - -#if LINUX - private const string _PaDll = "libportaudio.so.2.0.0"; -#endif -#endif - - [DllImport(_PaDll, CallingConvention = CallingConvention.Cdecl)] - public static extern int Pa_GetVersion(); - - [DllImport(_PaDll, EntryPoint = "Pa_GetVersionText", CallingConvention = CallingConvention.Cdecl)] - private static extern IntPtr IntPtr_Pa_GetVersionText(); - - public static string PaGetVersionText() - { - IntPtr strptr = IntPtr_Pa_GetVersionText(); - return Marshal.PtrToStringAnsi(strptr); - } - - [DllImport(_PaDll, EntryPoint = "Pa_GetErrorText", CallingConvention = CallingConvention.Cdecl)] - public static extern IntPtr IntPtr_Pa_GetErrorText(EPaError errorCode); - - public static string PaGetErrorText(EPaError errorCode) - { - IntPtr strptr = IntPtr_Pa_GetErrorText(errorCode); - return Marshal.PtrToStringAnsi(strptr); - } - - [DllImport(_PaDll, CallingConvention = CallingConvention.Cdecl)] - public static extern EPaError Pa_Initialize(); - - [DllImport(_PaDll, CallingConvention = CallingConvention.Cdecl)] - public static extern EPaError Pa_Terminate(); - - [DllImport(_PaDll, CallingConvention = CallingConvention.Cdecl)] - public static extern int Pa_GetHostApiCount(); - - [DllImport(_PaDll, CallingConvention = CallingConvention.Cdecl)] - public static extern int Pa_GetDefaultHostApi(); - - [DllImport(_PaDll, EntryPoint = "Pa_GetHostApiInfo", CallingConvention = CallingConvention.Cdecl)] - public static extern IntPtr IntPtr_Pa_GetHostApiInfo(int hostApi); - - public static SPaHostApiInfo PaGetHostApiInfo(int hostApi) - { - IntPtr structptr = IntPtr_Pa_GetHostApiInfo(hostApi); - return (SPaHostApiInfo)Marshal.PtrToStructure(structptr, typeof(SPaHostApiInfo)); - } - - [DllImport(_PaDll, CallingConvention = CallingConvention.Cdecl)] - public static extern int Pa_HostApiTypeIdToHostApiIndex(EPaHostApiTypeId type); - - [DllImport(_PaDll, CallingConvention = CallingConvention.Cdecl)] - public static extern int Pa_HostApiDeviceIndexToDeviceIndex(int hostApi, int hostApiDeviceIndex); - - [DllImport(_PaDll, EntryPoint = "Pa_GetLastHostErrorInfo", CallingConvention = CallingConvention.Cdecl)] - public static extern IntPtr IntPtr_Pa_GetLastHostErrorInfo(); - - public static SPaHostErrorInfo PaGetLastHostErrorInfo() - { - IntPtr structptr = IntPtr_Pa_GetLastHostErrorInfo(); - return (SPaHostErrorInfo)Marshal.PtrToStructure(structptr, typeof(SPaHostErrorInfo)); - } - - [DllImport(_PaDll, CallingConvention = CallingConvention.Cdecl)] - public static extern int Pa_GetDeviceCount(); - - [DllImport(_PaDll, CallingConvention = CallingConvention.Cdecl)] - public static extern int Pa_GetDefaultInputDevice(); - - [DllImport(_PaDll, CallingConvention = CallingConvention.Cdecl)] - public static extern int Pa_GetDefaultOutputDevice(); - - [DllImport(_PaDll, EntryPoint = "Pa_GetDeviceInfo", CallingConvention = CallingConvention.Cdecl)] - public static extern IntPtr IntPtr_Pa_GetDeviceInfo(int device); - - public static SPaDeviceInfo PaGetDeviceInfo(int device) - { - IntPtr structptr = IntPtr_Pa_GetDeviceInfo(device); - return (SPaDeviceInfo)Marshal.PtrToStructure(structptr, typeof(SPaDeviceInfo)); - } - - [DllImport(_PaDll, CallingConvention = CallingConvention.Cdecl)] - public static extern EPaError Pa_IsFormatSupported( - ref SPaStreamParameters inputParameters, - ref SPaStreamParameters outputParameters, - double sampleRate); - - [DllImport(_PaDll, CallingConvention = CallingConvention.Cdecl)] - public static extern EPaError Pa_OpenStream( - out IntPtr stream, - ref SPaStreamParameters inputParameters, - ref SPaStreamParameters outputParameters, - double sampleRate, - uint framesPerBuffer, - EPaStreamFlags streamFlags, - PaStreamCallbackDelegate streamCallback, - IntPtr userData); - - [DllImport(_PaDll, CallingConvention = CallingConvention.Cdecl)] - public static extern EPaError Pa_OpenStream( - out IntPtr stream, - ref SPaStreamParameters inputParameters, - IntPtr outputParameters, - double sampleRate, - uint framesPerBuffer, - EPaStreamFlags streamFlags, - PaStreamCallbackDelegate streamCallback, - IntPtr userData); - - [DllImport(_PaDll, CallingConvention = CallingConvention.Cdecl)] - public static extern EPaError Pa_OpenStream( - out IntPtr stream, - IntPtr inputParameters, - ref SPaStreamParameters outputParameters, - double sampleRate, - uint framesPerBuffer, - EPaStreamFlags streamFlags, - PaStreamCallbackDelegate streamCallback, - IntPtr userData); - - [DllImport(_PaDll, CallingConvention = CallingConvention.Cdecl)] - public static extern EPaError Pa_OpenDefaultStream( - out IntPtr stream, - int numInputChannels, - int numOutputChannels, - uint sampleFormat, - double sampleRate, - uint framesPerBuffer, - PaStreamCallbackDelegate streamCallback, - IntPtr userData); - - [DllImport(_PaDll, CallingConvention = CallingConvention.Cdecl)] - public static extern EPaError Pa_CloseStream(IntPtr stream); - - [DllImport(_PaDll, CallingConvention = CallingConvention.Cdecl)] - public static extern EPaError Pa_SetStreamFinishedCallback( - ref IntPtr stream, - [MarshalAs(UnmanagedType.FunctionPtr)] PaStreamFinishedCallbackDelegate streamFinishedCallback); - - [DllImport(_PaDll, CallingConvention = CallingConvention.Cdecl)] - public static extern EPaError Pa_StartStream(IntPtr stream); - - [DllImport(_PaDll, CallingConvention = CallingConvention.Cdecl)] - public static extern EPaError Pa_StopStream(IntPtr stream); - - [DllImport(_PaDll, CallingConvention = CallingConvention.Cdecl)] - public static extern EPaError Pa_AbortStream(IntPtr stream); - - [DllImport(_PaDll, CallingConvention = CallingConvention.Cdecl)] - public static extern EPaError Pa_IsStreamStopped(IntPtr stream); - - [DllImport(_PaDll, CallingConvention = CallingConvention.Cdecl)] - public static extern EPaError Pa_IsStreamActive(IntPtr stream); - - [DllImport(_PaDll, EntryPoint = "Pa_GetStreamInfo", CallingConvention = CallingConvention.Cdecl)] - public static extern IntPtr IntPtr_Pa_GetStreamInfo(IntPtr stream); - - public static SPaStreamInfo PaGetStreamInfo(IntPtr stream) - { - IntPtr structptr = IntPtr_Pa_GetStreamInfo(stream); - return (SPaStreamInfo)Marshal.PtrToStructure(structptr, typeof(SPaStreamInfo)); - } - - [DllImport(_PaDll, CallingConvention = CallingConvention.Cdecl)] - public static extern double Pa_GetStreamTime(IntPtr stream); - - [DllImport(_PaDll, CallingConvention = CallingConvention.Cdecl)] - public static extern double Pa_GetStreamCpuLoad(IntPtr stream); - - [DllImport(_PaDll, CallingConvention = CallingConvention.Cdecl)] - public static extern EPaError Pa_ReadStream( - IntPtr stream, - [Out] float[] buffer, - uint frames); - - [DllImport(_PaDll, CallingConvention = CallingConvention.Cdecl)] - public static extern EPaError Pa_ReadStream( - IntPtr stream, - [Out] byte[] buffer, - uint frames); - - [DllImport(_PaDll, CallingConvention = CallingConvention.Cdecl)] - public static extern EPaError Pa_ReadStream( - IntPtr stream, - [Out] sbyte[] buffer, - uint frames); - - [DllImport(_PaDll, CallingConvention = CallingConvention.Cdecl)] - public static extern EPaError Pa_ReadStream( - IntPtr stream, - [Out] ushort[] buffer, - uint frames); - - [DllImport(_PaDll, CallingConvention = CallingConvention.Cdecl)] - public static extern EPaError Pa_ReadStream( - IntPtr stream, - [Out] short[] buffer, - uint frames); - - [DllImport(_PaDll, CallingConvention = CallingConvention.Cdecl)] - public static extern EPaError Pa_ReadStream( - IntPtr stream, - [Out] uint[] buffer, - uint frames); - - [DllImport(_PaDll, CallingConvention = CallingConvention.Cdecl)] - public static extern EPaError Pa_ReadStream( - IntPtr stream, - [Out] int[] buffer, - uint frames); - - [DllImport(_PaDll, CallingConvention = CallingConvention.Cdecl)] - public static extern EPaError Pa_WriteStream( - IntPtr stream, - [In] float[] buffer, - uint frames); - - [DllImport(_PaDll, CallingConvention = CallingConvention.Cdecl)] - public static extern EPaError Pa_WriteStream( - IntPtr stream, - [In] byte[] buffer, - uint frames); - - [DllImport(_PaDll, CallingConvention = CallingConvention.Cdecl)] - public static extern EPaError Pa_WriteStream( - IntPtr stream, - [In] sbyte[] buffer, - uint frames); - - [DllImport(_PaDll, CallingConvention = CallingConvention.Cdecl)] - public static extern EPaError Pa_WriteStream( - IntPtr stream, - [In] ushort[] buffer, - uint frames); - - [DllImport(_PaDll, CallingConvention = CallingConvention.Cdecl)] - public static extern EPaError Pa_WriteStream( - IntPtr stream, - [In] short[] buffer, - uint frames); - - [DllImport(_PaDll, CallingConvention = CallingConvention.Cdecl)] - public static extern EPaError Pa_WriteStream( - IntPtr stream, - [In] uint[] buffer, - uint frames); - - [DllImport(_PaDll, CallingConvention = CallingConvention.Cdecl)] - public static extern EPaError Pa_WriteStream( - IntPtr stream, - [In] int[] buffer, - uint frames); - - [DllImport(_PaDll, CallingConvention = CallingConvention.Cdecl)] - public static extern int Pa_GetStreamReadAvailable(IntPtr stream); - - [DllImport(_PaDll, CallingConvention = CallingConvention.Cdecl)] - public static extern int Pa_GetStreamWriteAvailable(IntPtr stream); - - [DllImport(_PaDll, CallingConvention = CallingConvention.Cdecl)] - public static extern EPaError Pa_GetSampleSize(EPaSampleFormat format); - - [DllImport(_PaDll, CallingConvention = CallingConvention.Cdecl)] - public static extern void Pa_Sleep(int msec); - #endregion - } - - // ReSharper restore UnusedMember.Global - // ReSharper restore FieldCanBeMadeReadOnly.Global - // ReSharper restore MemberCanBePrivate.Global -} \ No newline at end of file diff --git a/Vocaluxe/Lib/Sound/Record/PortAudio/CPortAudioRecord.cs b/Vocaluxe/Lib/Sound/Record/PortAudio/CPortAudioRecord.cs index 98a3dd72..5c05be0a 100644 --- a/Vocaluxe/Lib/Sound/Record/PortAudio/CPortAudioRecord.cs +++ b/Vocaluxe/Lib/Sound/Record/PortAudio/CPortAudioRecord.cs @@ -21,7 +21,6 @@ using System; using System.Collections.Generic; using System.Runtime.InteropServices; using Vocaluxe.Base; -using Vocaluxe.Lib.Sound.PortAudio; namespace Vocaluxe.Lib.Sound.Record.PortAudio { @@ -30,7 +29,7 @@ namespace Vocaluxe.Lib.Sound.Record.PortAudio private bool _Initialized; private List _Devices; - private CPortAudio.PaStreamCallbackDelegate _MyRecProc; + private PortAudioSharp.PortAudio.PaStreamCallbackDelegate _MyRecProc; private IntPtr[] _RecHandle; private readonly CBuffer[] _Buffer; @@ -59,19 +58,19 @@ namespace Vocaluxe.Lib.Sound.Record.PortAudio if (_Initialized) CloseAll(); - if (_ErrorCheck("Initialize", CPortAudio.Pa_Initialize())) + if (_ErrorCheck("Initialize", PortAudioSharp.PortAudio.Pa_Initialize())) return false; _Initialized = true; int hostAPI = _ApiSelect(); - int numDevices = CPortAudio.Pa_GetDeviceCount(); + int numDevices = PortAudioSharp.PortAudio.Pa_GetDeviceCount(); for (int i = 0; i < numDevices; i++) { - CPortAudio.SPaDeviceInfo info = CPortAudio.PaGetDeviceInfo(i); - if (info.HostApi == hostAPI && info.MaxInputChannels > 0) + PortAudioSharp.PortAudio.PaDeviceInfo info = PortAudioSharp.PortAudio.Pa_GetDeviceInfo(i); + if (info.hostApi == hostAPI && info.maxInputChannels > 0) { - var dev = new CRecordDevice( i, info.Name,info.Name + i, info.MaxInputChannels); + var dev = new CRecordDevice(i, info.name, info.name + i, info.maxInputChannels); _Devices.Add(dev); } @@ -108,7 +107,7 @@ namespace Vocaluxe.Lib.Sound.Record.PortAudio foreach (IntPtr handle in _RecHandle) { int waitcount = 0; - while (waitcount < 5 && CPortAudio.Pa_IsStreamStopped(handle) == CPortAudio.EPaError.PaStreamIsNotStopped) + while (waitcount < 5 && PortAudioSharp.PortAudio.Pa_IsStreamStopped(handle) == PortAudioSharp.PortAudio.PaError.paStreamIsNotStopped) { Thread.Sleep(1); waitcount++; @@ -130,26 +129,26 @@ namespace Vocaluxe.Lib.Sound.Record.PortAudio { if (active[i]) { - var inputParams = new CPortAudio.SPaStreamParameters + PortAudioSharp.PortAudio.PaStreamParameters? inputParams = new PortAudioSharp.PortAudio.PaStreamParameters { - ChannelCount = _Devices[i].Channels, - Device = _Devices[i].ID, - SampleFormat = CPortAudio.EPaSampleFormat.PaInt16, - SuggestedLatency = CPortAudio.PaGetDeviceInfo(_Devices[i].ID).DefaultLowInputLatency + channelCount = _Devices[i].Channels, + device = _Devices[i].ID, + sampleFormat = PortAudioSharp.PortAudio.PaSampleFormat.paInt16, + suggestedLatency = PortAudioSharp.PortAudio.Pa_GetDeviceInfo(_Devices[i].ID).defaultLowInputLatency }; - - if (_ErrorCheck("OpenStream (rec)", CPortAudio.Pa_OpenStream( + PortAudioSharp.PortAudio.PaStreamParameters? outputParams = null; + if (_ErrorCheck("OpenStream (rec)", PortAudioSharp.PortAudio.Pa_OpenStream( out _RecHandle[i], ref inputParams, - IntPtr.Zero, + ref outputParams, 44100, 882, - CPortAudio.EPaStreamFlags.PaNoFlag, + PortAudioSharp.PortAudio.PaStreamFlags.paNoFlag, _MyRecProc, new IntPtr(i)))) return false; - if (_ErrorCheck("Start Stream (rec)", CPortAudio.Pa_StartStream(_RecHandle[i]))) + if (_ErrorCheck("Start Stream (rec)", PortAudioSharp.PortAudio.Pa_StartStream(_RecHandle[i]))) return false; } } @@ -166,7 +165,7 @@ namespace Vocaluxe.Lib.Sound.Record.PortAudio return false; foreach (IntPtr handle in _RecHandle) - CPortAudio.Pa_StopStream(handle); + PortAudioSharp.PortAudio.Pa_StopStream(handle); return true; } @@ -179,7 +178,7 @@ namespace Vocaluxe.Lib.Sound.Record.PortAudio if (_Initialized) { - CPortAudio.Pa_Terminate(); + PortAudioSharp.PortAudio.Pa_Terminate(); _Initialized = false; } @@ -265,12 +264,12 @@ namespace Vocaluxe.Lib.Sound.Record.PortAudio return _Devices.AsReadOnly(); } - private CPortAudio.EPaStreamCallbackResult _MyPaStreamCallback( + private PortAudioSharp.PortAudio.PaStreamCallbackResult _MyPaStreamCallback( IntPtr input, IntPtr output, uint frameCount, - ref CPortAudio.SPaStreamCallbackTimeInfo timeInfo, - CPortAudio.EPaStreamCallbackFlags statusFlags, + ref PortAudioSharp.PortAudio.PaStreamCallbackTimeInfo timeInfo, + PortAudioSharp.PortAudio.PaStreamCallbackFlags statusFlags, IntPtr userData) { try @@ -312,20 +311,20 @@ namespace Vocaluxe.Lib.Sound.Record.PortAudio CLog.LogError("Error on Stream Callback (rec): " + e); } - return CPortAudio.EPaStreamCallbackResult.PaContinue; + return PortAudioSharp.PortAudio.PaStreamCallbackResult.paContinue; } - private bool _ErrorCheck(String action, CPortAudio.EPaError errorCode) + private bool _ErrorCheck(String action, PortAudioSharp.PortAudio.PaError errorCode) { - if (errorCode != CPortAudio.EPaError.PaNoError) + if (errorCode != PortAudioSharp.PortAudio.PaError.paNoError) { - CLog.LogError(action + " error (rec): " + CPortAudio.PaGetErrorText(errorCode)); - if (errorCode == CPortAudio.EPaError.PaUnanticipatedHostError) + CLog.LogError(action + " error (rec): " + PortAudioSharp.PortAudio.Pa_GetErrorText(errorCode)); + if (errorCode == PortAudioSharp.PortAudio.PaError.paUnanticipatedHostError) { - CPortAudio.SPaHostErrorInfo errorInfo = CPortAudio.PaGetLastHostErrorInfo(); - CLog.LogError("- Host error API type: " + errorInfo.HostApiType); - CLog.LogError("- Host error code: " + errorInfo.ErrorCode); - CLog.LogError("- Host error text: " + errorInfo.ErrorText); + PortAudioSharp.PortAudio.PaHostErrorInfo errorInfo = PortAudioSharp.PortAudio.Pa_GetLastHostErrorInfo(); + CLog.LogError("- Host error API type: " + errorInfo.hostApiType); + CLog.LogError("- Host error code: " + errorInfo.errorCode); + CLog.LogError("- Host error text: " + errorInfo.errorText); } return true; } @@ -338,13 +337,13 @@ namespace Vocaluxe.Lib.Sound.Record.PortAudio if (!_Initialized) return 0; - int selectedHostApi = CPortAudio.Pa_GetDefaultHostApi(); - int apiCount = CPortAudio.Pa_GetHostApiCount(); + int selectedHostApi = PortAudioSharp.PortAudio.Pa_GetDefaultHostApi(); + int apiCount = PortAudioSharp.PortAudio.Pa_GetHostApiCount(); for (int i = 0; i < apiCount; i++) { - CPortAudio.SPaHostApiInfo apiInfo = CPortAudio.PaGetHostApiInfo(i); - if ((apiInfo.Type == CPortAudio.EPaHostApiTypeId.PaDirectSound) - || (apiInfo.Type == CPortAudio.EPaHostApiTypeId.PaALSA)) + PortAudioSharp.PortAudio.PaHostApiInfo apiInfo = PortAudioSharp.PortAudio.Pa_GetHostApiInfo(i); + if ((apiInfo.type == PortAudioSharp.PortAudio.PaHostApiTypeId.paDirectSound) + || (apiInfo.type == PortAudioSharp.PortAudio.PaHostApiTypeId.paALSA)) selectedHostApi = i; } return selectedHostApi; diff --git a/Vocaluxe/Program.cs b/Vocaluxe/Program.cs index b59d4f9e..1cb6d368 100644 --- a/Vocaluxe/Program.cs +++ b/Vocaluxe/Program.cs @@ -20,7 +20,6 @@ using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; -using System.Runtime.InteropServices; using System.Threading; using System.Windows.Forms; using Vocaluxe.Base; @@ -32,12 +31,6 @@ namespace Vocaluxe { static class CMainProgram { -#if WIN - [DllImport("user32.dll")] - [return: MarshalAs(UnmanagedType.Bool)] - private static extern bool SetForegroundWindow(IntPtr hWnd); -#endif - private static CSplashScreen _SplashScreen; [STAThread, HandleProcessCorruptedStateExceptions] @@ -85,6 +78,7 @@ namespace Vocaluxe if (!CProgrammHelper.CheckRequirements()) return; + CProgrammHelper.Init(); CMain.Init(); CSettings.CreateFolders(); @@ -228,13 +222,15 @@ namespace Vocaluxe { MessageBox.Show("Error on start up: " + e.Message + e.StackTrace); CLog.LogError("Error on start up: " + e); - _SplashScreen.Close(); + if (_SplashScreen != null) + _SplashScreen.Close(); _CloseProgram(); } Application.DoEvents(); // Start Main Loop - _SplashScreen.Close(); + if (_SplashScreen != null) + _SplashScreen.Close(); CVocaluxeServer.Start(); CDraw.MainLoop(); @@ -332,7 +328,7 @@ namespace Vocaluxe { IntPtr wnd = process.MainWindowHandle; if (wnd != IntPtr.Zero) - SetForegroundWindow(wnd); + COSFunctions.SetForegroundWindow(wnd); } #endif return false; diff --git a/Vocaluxe/Vocaluxe.csproj b/Vocaluxe/Vocaluxe.csproj index 4087a99e..d89cca3f 100644 --- a/Vocaluxe/Vocaluxe.csproj +++ b/Vocaluxe/Vocaluxe.csproj @@ -199,6 +199,10 @@ ..\Output\OpenTK.GLControl.dll + + False + ..\Output\PortAudioSharp.dll + False ..\Output\QRCoder.dll @@ -212,6 +216,7 @@ + @@ -327,7 +332,6 @@ Designer - PreserveNewest