📄 w32_portaudio_dll.c
字号:
/* TiMidity++ -- MIDI to WAVE converter and player Copyright (C) 1999-2002 Masanao Izumo <mo@goice.co.jp> Copyright (C) 1995 Tuukka Toivonen <tt@cgs.fi> This program 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 2 of the License, or (at your option) any later version. This program 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 this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA*/#ifdef HAVE_CONFIG_H#include "config.h"#endif /* HAVE_CONFIG_H */#include "interface.h"#ifdef AU_PORTAUDIO_DLL#include <windows.h>#include <portaudio.h>#include "w32_portaudio.h"extern int load_portaudio_dll(int type);extern void free_portaudio_dll(void);/*************************************************************** name: portaudio_dll dll: portaudio.dll ***************************************************************/// (PaError)0 -> paDeviceUnavailable// (PaDeviceID)0 -> paNoDevice// #define PA_DLL_ASIO 1// #define PA_DLL_WIN_DS 2// #define PA_DLL_WIN_WMME 3#define PA_DLL_ASIO_FILE "pa_asio.dll"#define PA_DLL_WIN_DS_FILE "pa_win_ds.dll"#define PA_DLL_WIN_WMME_FILE "pa_win_wmme.dll"typedef PaError(*type_Pa_Initialize)( void );typedef PaError(*type_Pa_Terminate)( void );typedef long(*type_Pa_GetHostError)( void );typedef const char*(*type_Pa_GetErrorText)( PaError errnum );typedef int(*type_Pa_CountDevices)( void );typedef PaDeviceID(*type_Pa_GetDefaultInputDeviceID)( void );typedef PaDeviceID(*type_Pa_GetDefaultOutputDeviceID)( void );typedef const PaDeviceInfo*(*type_Pa_GetDeviceInfo)( PaDeviceID device );typedef PaError(*type_Pa_OpenStream)( PortAudioStream** stream,PaDeviceID inputDevice,int numInputChannels,PaSampleFormat inputSampleFormat,void *inputDriverInfo,PaDeviceID outputDevice,int numOutputChannels,PaSampleFormat outputSampleFormat,void *outputDriverInfo,double sampleRate,unsigned long framesPerBuffer,unsigned long numberOfBuffers,PaStreamFlags streamFlags,PortAudioCallback *callback,void *userData );typedef PaError(*type_Pa_OpenDefaultStream)( PortAudioStream** stream,int numInputChannels,int numOutputChannels,PaSampleFormat sampleFormat,double sampleRate,unsigned long framesPerBuffer,unsigned long numberOfBuffers,PortAudioCallback *callback,void *userData );typedef PaError(*type_Pa_CloseStream)( PortAudioStream *stream );typedef PaError(*type_Pa_StartStream)( PortAudioStream *stream );typedef PaError(*type_Pa_StopStream)( PortAudioStream *stream );typedef PaError(*type_Pa_AbortStream)( PortAudioStream *stream );typedef PaError(*type_Pa_StreamActive)( PortAudioStream *stream );typedef PaTimestamp(*type_Pa_StreamTime)( PortAudioStream *stream );typedef double(*type_Pa_GetCPULoad)( PortAudioStream* stream );typedef int(*type_Pa_GetMinNumBuffers)( int framesPerBuffer, double sampleRate );typedef void(*type_Pa_Sleep)( long msec );typedef PaError(*type_Pa_GetSampleSize)( PaSampleFormat format );static struct portaudio_dll_ { type_Pa_Initialize Pa_Initialize; type_Pa_Terminate Pa_Terminate; type_Pa_GetHostError Pa_GetHostError; type_Pa_GetErrorText Pa_GetErrorText; type_Pa_CountDevices Pa_CountDevices; type_Pa_GetDefaultInputDeviceID Pa_GetDefaultInputDeviceID; type_Pa_GetDefaultOutputDeviceID Pa_GetDefaultOutputDeviceID; type_Pa_GetDeviceInfo Pa_GetDeviceInfo; type_Pa_OpenStream Pa_OpenStream; type_Pa_OpenDefaultStream Pa_OpenDefaultStream; type_Pa_CloseStream Pa_CloseStream; type_Pa_StartStream Pa_StartStream; type_Pa_StopStream Pa_StopStream; type_Pa_AbortStream Pa_AbortStream; type_Pa_StreamActive Pa_StreamActive; type_Pa_StreamTime Pa_StreamTime; type_Pa_GetCPULoad Pa_GetCPULoad; type_Pa_GetMinNumBuffers Pa_GetMinNumBuffers; type_Pa_Sleep Pa_Sleep; type_Pa_GetSampleSize Pa_GetSampleSize;} portaudio_dll;static volatile HANDLE h_portaudio_dll = NULL;void free_portaudio_dll(void){ if(h_portaudio_dll){ FreeLibrary(h_portaudio_dll); h_portaudio_dll = NULL; }}int load_portaudio_dll(int type){ char* dll_file = NULL; switch(type){ case PA_DLL_ASIO: dll_file = PA_DLL_ASIO_FILE; break; case PA_DLL_WIN_DS: dll_file = PA_DLL_WIN_DS_FILE; break; case PA_DLL_WIN_WMME: dll_file = PA_DLL_WIN_WMME_FILE; break; default: return -1; } if(!h_portaudio_dll){ h_portaudio_dll = LoadLibrary(dll_file); if(!h_portaudio_dll) return -1; } portaudio_dll.Pa_Initialize = (type_Pa_Initialize)GetProcAddress(h_portaudio_dll,"Pa_Initialize"); if(!portaudio_dll.Pa_Initialize){ free_portaudio_dll(); return -1; } portaudio_dll.Pa_Terminate = (type_Pa_Terminate)GetProcAddress(h_portaudio_dll,"Pa_Terminate"); if(!portaudio_dll.Pa_Terminate){ free_portaudio_dll(); return -1; } portaudio_dll.Pa_GetHostError = (type_Pa_GetHostError)GetProcAddress(h_portaudio_dll,"Pa_GetHostError"); if(!portaudio_dll.Pa_GetHostError){ free_portaudio_dll(); return -1; } portaudio_dll.Pa_GetErrorText = (type_Pa_GetErrorText)GetProcAddress(h_portaudio_dll,"Pa_GetErrorText"); if(!portaudio_dll.Pa_GetErrorText){ free_portaudio_dll(); return -1; } portaudio_dll.Pa_CountDevices = (type_Pa_CountDevices)GetProcAddress(h_portaudio_dll,"Pa_CountDevices"); if(!portaudio_dll.Pa_CountDevices){ free_portaudio_dll(); return -1; } portaudio_dll.Pa_GetDefaultInputDeviceID = (type_Pa_GetDefaultInputDeviceID)GetProcAddress(h_portaudio_dll,"Pa_GetDefaultInputDeviceID"); if(!portaudio_dll.Pa_GetDefaultInputDeviceID){ free_portaudio_dll(); return -1; } portaudio_dll.Pa_GetDefaultOutputDeviceID = (type_Pa_GetDefaultOutputDeviceID)GetProcAddress(h_portaudio_dll,"Pa_GetDefaultOutputDeviceID"); if(!portaudio_dll.Pa_GetDefaultOutputDeviceID){ free_portaudio_dll(); return -1; } portaudio_dll.Pa_GetDeviceInfo = (type_Pa_GetDeviceInfo)GetProcAddress(h_portaudio_dll,"Pa_GetDeviceInfo"); if(!portaudio_dll.Pa_GetDeviceInfo){ free_portaudio_dll(); return -1; } portaudio_dll.Pa_OpenStream = (type_Pa_OpenStream)GetProcAddress(h_portaudio_dll,"Pa_OpenStream"); if(!portaudio_dll.Pa_OpenStream){ free_portaudio_dll(); return -1; } portaudio_dll.Pa_OpenDefaultStream = (type_Pa_OpenDefaultStream)GetProcAddress(h_portaudio_dll,"Pa_OpenDefaultStream"); if(!portaudio_dll.Pa_OpenDefaultStream){ free_portaudio_dll(); return -1; } portaudio_dll.Pa_CloseStream = (type_Pa_CloseStream)GetProcAddress(h_portaudio_dll,"Pa_CloseStream"); if(!portaudio_dll.Pa_CloseStream){ free_portaudio_dll(); return -1; } portaudio_dll.Pa_StartStream = (type_Pa_StartStream)GetProcAddress(h_portaudio_dll,"Pa_StartStream"); if(!portaudio_dll.Pa_StartStream){ free_portaudio_dll(); return -1; } portaudio_dll.Pa_StopStream = (type_Pa_StopStream)GetProcAddress(h_portaudio_dll,"Pa_StopStream"); if(!portaudio_dll.Pa_StopStream){ free_portaudio_dll(); return -1; } portaudio_dll.Pa_AbortStream = (type_Pa_AbortStream)GetProcAddress(h_portaudio_dll,"Pa_AbortStream"); if(!portaudio_dll.Pa_AbortStream){ free_portaudio_dll(); return -1; } portaudio_dll.Pa_StreamActive = (type_Pa_StreamActive)GetProcAddress(h_portaudio_dll,"Pa_StreamActive"); if(!portaudio_dll.Pa_StreamActive){ free_portaudio_dll(); return -1; } portaudio_dll.Pa_StreamTime = (type_Pa_StreamTime)GetProcAddress(h_portaudio_dll,"Pa_StreamTime"); if(!portaudio_dll.Pa_StreamTime){ free_portaudio_dll(); return -1; } portaudio_dll.Pa_GetCPULoad = (type_Pa_GetCPULoad)GetProcAddress(h_portaudio_dll,"Pa_GetCPULoad"); if(!portaudio_dll.Pa_GetCPULoad){ free_portaudio_dll(); return -1; } portaudio_dll.Pa_GetMinNumBuffers = (type_Pa_GetMinNumBuffers)GetProcAddress(h_portaudio_dll,"Pa_GetMinNumBuffers"); if(!portaudio_dll.Pa_GetMinNumBuffers){ free_portaudio_dll(); return -1; } portaudio_dll.Pa_Sleep = (type_Pa_Sleep)GetProcAddress(h_portaudio_dll,"Pa_Sleep"); if(!portaudio_dll.Pa_Sleep){ free_portaudio_dll(); return -1; } portaudio_dll.Pa_GetSampleSize = (type_Pa_GetSampleSize)GetProcAddress(h_portaudio_dll,"Pa_GetSampleSize"); if(!portaudio_dll.Pa_GetSampleSize){ free_portaudio_dll(); return -1; } return 0;}PaError Pa_Initialize( void ){ if(h_portaudio_dll){ return portaudio_dll.Pa_Initialize(); } return paDeviceUnavailable;}PaError Pa_Terminate( void ){ if(h_portaudio_dll){ return portaudio_dll.Pa_Terminate(); } return paDeviceUnavailable;}long Pa_GetHostError( void ){ if(h_portaudio_dll){ return portaudio_dll.Pa_GetHostError(); } return (long)0;}const char* Pa_GetErrorText( PaError errnum ){ if(h_portaudio_dll){ return portaudio_dll.Pa_GetErrorText(errnum); } return (const char*)0;}int Pa_CountDevices( void ){ if(h_portaudio_dll){ return portaudio_dll.Pa_CountDevices(); } return (int)0;}PaDeviceID Pa_GetDefaultInputDeviceID( void ){ if(h_portaudio_dll){ return portaudio_dll.Pa_GetDefaultInputDeviceID(); } return paNoDevice;}PaDeviceID Pa_GetDefaultOutputDeviceID( void ){ if(h_portaudio_dll){ return portaudio_dll.Pa_GetDefaultOutputDeviceID(); } return paNoDevice;}const PaDeviceInfo* Pa_GetDeviceInfo( PaDeviceID device ){ if(h_portaudio_dll){ return portaudio_dll.Pa_GetDeviceInfo(device); } return (const PaDeviceInfo*)0;}PaError Pa_OpenStream( PortAudioStream** stream,PaDeviceID inputDevice,int numInputChannels,PaSampleFormat inputSampleFormat,void *inputDriverInfo,PaDeviceID outputDevice,int numOutputChannels,PaSampleFormat outputSampleFormat,void *outputDriverInfo,double sampleRate,unsigned long framesPerBuffer,unsigned long numberOfBuffers,PaStreamFlags streamFlags,PortAudioCallback *callback,void *userData ){ if(h_portaudio_dll){ return portaudio_dll.Pa_OpenStream(stream,inputDevice,numInputChannels,inputSampleFormat,inputDriverInfo,outputDevice,numOutputChannels,outputSampleFormat,outputDriverInfo,sampleRate,framesPerBuffer,numberOfBuffers,streamFlags,callback,userData); } return (PaError)0;}PaError Pa_OpenDefaultStream( PortAudioStream** stream,int numInputChannels,int numOutputChannels,PaSampleFormat sampleFormat,double sampleRate,unsigned long framesPerBuffer,unsigned long numberOfBuffers,PortAudioCallback *callback,void *userData ){ if(h_portaudio_dll){ return portaudio_dll.Pa_OpenDefaultStream(stream,numInputChannels,numOutputChannels,sampleFormat,sampleRate,framesPerBuffer,numberOfBuffers,callback,userData); } return (PaError)0;}PaError Pa_CloseStream( PortAudioStream *stream ){ if(h_portaudio_dll){ return portaudio_dll.Pa_CloseStream(stream); } return paDeviceUnavailable;}PaError Pa_StartStream( PortAudioStream *stream ){ if(h_portaudio_dll){ return portaudio_dll.Pa_StartStream(stream); } return paDeviceUnavailable;}PaError Pa_StopStream( PortAudioStream *stream ){ if(h_portaudio_dll){ return portaudio_dll.Pa_StopStream(stream); } return paDeviceUnavailable;}PaError Pa_AbortStream( PortAudioStream *stream ){ if(h_portaudio_dll){ return portaudio_dll.Pa_AbortStream(stream); } return paDeviceUnavailable;}PaError Pa_StreamActive( PortAudioStream *stream ){ if(h_portaudio_dll){ return portaudio_dll.Pa_StreamActive(stream); } return paDeviceUnavailable;}PaTimestamp Pa_StreamTime( PortAudioStream *stream ){ if(h_portaudio_dll){ return portaudio_dll.Pa_StreamTime(stream); } return (PaTimestamp)0;}double Pa_GetCPULoad( PortAudioStream* stream ){ if(h_portaudio_dll){ return portaudio_dll.Pa_GetCPULoad(stream); } return (double)0;}int Pa_GetMinNumBuffers( int framesPerBuffer, double sampleRate ){ if(h_portaudio_dll){ return portaudio_dll.Pa_GetMinNumBuffers(framesPerBuffer,sampleRate); } return (int)0;}void Pa_Sleep( long msec ){ if(h_portaudio_dll){ portaudio_dll.Pa_Sleep(msec); }}PaError Pa_GetSampleSize( PaSampleFormat format ){ if(h_portaudio_dll){ return portaudio_dll.Pa_GetSampleSize(format); } return paDeviceUnavailable;}/***************************************************************/#endif /* AU_PORTAUDIO_DLL */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -