From b0d6234ae0d543f93041801b11b8d81610447de5 Mon Sep 17 00:00:00 2001 From: rossbencina Date: Fri, 26 Jul 2002 19:35:31 +0000 Subject: [PATCH] removed proposal documentation and changed proposals.html to document new location for proposals --- docs/PaStreamStateDiagram.gif | Bin 9720 -> 0 bytes docs/pa_drivermodel.c.txt | 488 ---------------------------------- docs/pa_drivermodel.h.txt | 143 ---------- docs/proposals.html | Bin 74012 -> 1085 bytes 4 files changed, 631 deletions(-) delete mode 100644 docs/PaStreamStateDiagram.gif delete mode 100644 docs/pa_drivermodel.c.txt delete mode 100644 docs/pa_drivermodel.h.txt diff --git a/docs/PaStreamStateDiagram.gif b/docs/PaStreamStateDiagram.gif deleted file mode 100644 index d1fcae0b6e01e226b8c6d2d096360a7ca5152c1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9720 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 Z807|4Pmw}-G@?9vQC^@pzh}>Q{|6L$0{s90 diff --git a/docs/pa_drivermodel.c.txt b/docs/pa_drivermodel.c.txt deleted file mode 100644 index 956f664..0000000 --- a/docs/pa_drivermodel.c.txt +++ /dev/null @@ -1,488 +0,0 @@ -/* - This file contains the host-neutral code for implementing multiple driver model - support in PortAudio. - - It has not been compiled, but it is supplied only for example purposes at this stage. - - TODO: use of CHECK_DRIVER_MODEL is bogus in some instances since some - of those functions don't return a PaError - - -*/ - -#include "pa_drivermodel.h.txt" - - -#ifndef PA_MULTIDRIVER -/* single driver support, most functions will stay in the implementation files */ - -PaDriverModelID Pa_CountDriverModels() -{ - return 1; -} - -/* -Perhaps all drivers should define this with this signature -const PaDriverModelInfo* Pa_GetDriverModelInfo( PaDriverModelID driverModelID ) -{ -} -*/ - -PaDeviceID Pa_DriverModelDefaultInputDeviceID( PaDriverModelID driverModelID ) -{ - return Pa_GetDefaultInputDeviceID(); -} - - -PaDeviceID Pa_DriverModelDefaultOutputDeviceID( PaDriverModelID driverModelID ) -{ - return Pa_GetDefaultInputDeviceID(); -} - -/* -Perhaps all drivers should define with this signature -int Pa_DriverModelMinNumBuffers( PaDriverModelID driverModelID, int framesPerBuffer, double sampleRate ) -{ - -} -*/ - -int Pa_DriverModelCountDevices( PaDriverModelID driverModelID ) -{ - return Pa_CountDevices(); -} - -PaDeviceID Pa_DriverModelGetDeviceID(PaDriverModelID driverModelID, int perDriverModelIndex ) -{ - return perDriverModelIndex; -} - - -#else -/* multidriver support */ - - -typedef PaError (*PaInitializeFunPtr)( PaDriverModelImplementation** ); - -/* - the initializers array is a static table of function pointers - to all the available driverModels on the current platform. - - the order of pointers in the array is important. the first - pointer is always considered to be the "default" driver model. -*/ - -static PaInitializeFunPtr driverModelInitializers[] = { -#ifdef WINDOWS - PaWin32WMME_MultiDriverInitialize, - PaWin32DS_MultiDriverInitialize, - PaASIO_MultiDriverInitialize -#endif -#ifdef MAC - PaMacSM_MultiDriverInitialize, - PaMacCA_MultiDriverInitialize, - PaASIO_MultiDriverInitialize -#endif -/* other platforms here */ - (PaInitializeFunPtr*)0 /* NULL terminate the list */ -}; - - -/* - the driverModels array is a dynamically created table of - currently available driverModels. -*/ -static PaDriverModelImplementation* driverModels = 0; -static int numDriverModels = 0; - - -#define PA_CHECK_INITIALIZED\ - if( driverModels == 0 ) - return paLibraryNotInitialised - -#define PA_CHECK_DRIVER_MODEL_ID( id ) - if( id < 0 || id >= numDriverModels ) - return paBadDriverModelID; - - -/* - ConvertPublicDeviceIdToImplementationDeviceId converts deviceId - from a public device id, to a device id for a particular - PortAudio implementation. On return impl will either point - to a valid implementation or will be NULL. -*/ -static void ConvertPublicDeviceIDToImplementationDeviceID( - PaDriverModelImplementation *impl, PaDeviceID deviceID ) -{ - int i, count; - - impl = NULL; - - for( i=0; i < numDriverModels; ++i ){ - count = driverModels[i]->countDevices(); - if( deviceID < count ){ - impl = driverModels[i]; - return NULL; - }else{ - deviceID -= count; - } - } -} - -static PaDeviceID ConvertImplementationDeviceIDToPublicDeviceID( - PaDriverModelID driverModelID, PaDeviceID deviceID ) -{ - int i; - - for( i=0; i < driverModelID; ++i ) - deviceID += driverModels[i]->countDevices(); -} - - -PaError Pa_Initialize( void ) -{ - PaError result = paNoError; - int i, initializerCount; - PaDriverModelImplementation *impl; - - if( driverModels != 0 ) - return paAlreadyInitialized; - - /* count the number of driverModels */ - initializerCount=0; - while( driverModelInitializers[initializerCount] != 0 ){ - ++initializerCount; - } - - driverModels = malloc( sizeof(PaDriverModelImplementation*) * initializerCount ); - if( driverModels == NULL ) - return paInsufficientMemory; - - numDriverModels = 0; - for( i=0; iterminate( driverModels[i] ); -} - - -long Pa_GetHostError( void ) -{ - PA_CHECK_INITIALIZED; - - under construction. depends on error text proposal. -} - - -const char *Pa_GetErrorText( PaError errnum ) -{ - PA_CHECK_INITIALIZED; - - under construction. may need to call driver model specific code - depending on how the error text proposal pans out. -} - - - -int Pa_CountDevices() -{ - int i, result; - - PA_CHECK_INITIALIZED; - - result = 0; - for( i=0; i < numDriverModels; ++i ) - result += driverModels[i]->countDevices(); - - return result; -} - - -PaDeviceID Pa_GetDefaultInputDeviceID( void ) -{ - PA_CHECK_INITIALIZED; - - return driverModels[0]->getDefaultInputDeviceID(); -} - -PaDeviceID Pa_GetDefaultOutputDeviceID( void ) -{ - PA_CHECK_INITIALIZED; - - return driverModels[0]->getDefaultInputDeviceID(); -} - - -const PaDeviceInfo* Pa_GetDeviceInfo( PaDeviceID deviceID ) -{ - PaDriverModelImplementation *impl; - - PA_CHECK_INITIALIZED; - - ConvertPublicDeviceIDToImplementationDeviceID( impl, deviceID ); - if( impl == NULL ) - return paInvalidDeviceID; - - return impl->getDeviceInfo( deviceID ); -} - -/* NEW MULTIPLE DRIVER MODEL FUNCTIONS ---------------------------------- */ - -PaDriverModelID Pa_CountDriverModels() -{ - PA_CHECK_INITIALIZED; - - return numDriverModels; -} - - -const PaDriverModelInfo* Pa_GetDriverModelInfo( PaDriverModelID driverModelID ) -{ - PA_CHECK_INITIALIZED; - PA_CHECK_DRIVER_MODEL_ID( driverModelID ); - - return driverModels[ driverModelID ]->getDriverModelInfo(); -} - - -PaDeviceID Pa_DriverModelDefaultInputDeviceID( PaDriverModelID driverModelID ) -{ - PA_CHECK_INITIALIZED; - PA_CHECK_DRIVER_MODEL_ID( driverModelID ); - - return ConvertImplementationDeviceIDToPublicDeviceID( driverModelID, - driverModels[ driverModelID ]->getDefaultInputDeviceID(); -} - - -PaDeviceID Pa_DriverModelDefaultOutputDeviceID( PaDriverModelID driverModelID ) -{ - PA_CHECK_INITIALIZED; - PA_CHECK_DRIVER_MODEL_ID( driverModelID ); - - return ConvertImplementationDeviceIDToPublicDeviceID( driverModelID, - driverModels[ driverModelID ]->getDefaultOutputDeviceID(); -} - - -int Pa_DriverModelMinNumBuffers( PaDriverModelID driverModelID, int framesPerBuffer, double sampleRate ) -{ - PA_CHECK_INITIALIZED; - PA_CHECK_DRIVER_MODEL_ID( driverModelID ); - - return driverModels[ driverModelID ]->getMinNumBuffers( int framesPerBuffer, double sampleRate ); -} - - -int Pa_DriverModelCountDevices( PaDriverModelID driverModelID ) -{ - PA_CHECK_INITIALIZED; - PA_CHECK_DRIVER_MODEL_ID( driverModelID ); - - return driverModels[ driverModelID ]->coundDevices(); -} - -PaDeviceID Pa_DriverModelGetDeviceID(PaDriverModelID driverModelID, int perDriverModelIndex ) -{ - PA_CHECK_INITIALIZED; - PA_CHECK_DRIVER_MODEL_ID( driverModelID ); - - return ConvertImplementationDeviceIDToPublicDeviceID( driverModelID, perDriverModelIndex ); -} - -/* END NEW MULTIPLE DRIVER MODEL FUNCTIONS ------------------------------ */ - - -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 ) -{ - PaError result; - PaDriverModelImplementation *inputImpl, *outputImpl, impl; - - PA_CHECK_INITIALIZED; - - if( inputDevice != paNoDevice ){ - ConvertPublicDeviceIDToImplementationDeviceID( inputImpl, inputDevice ); - if( inputImpl == NULL ) - return paInvalidDeviceID; - else - impl = inputImpl; - } - - if( outputDevice != paNoDevice ){ - ConvertPublicDeviceIDToImplementationDeviceID( outputImpl, outputDevice ); - if( outputImpl == NULL ) - return paInvalidDeviceID; - else - impl = outputImpl; - } - - if( inputDevice != paNoDevice && outputDevice != paNoDevice ){ - if( inputImpl != outputImpl ) - return paDevicesMustBelongToTheSameDriverModel; - } - - - result = impl->openStream( stream, inputDevice, numInputChannels, inputSampleFormat, inputDriverInfo, - outputDevice, numOutputChannels, outputSampleFormat, outputDriverInfo, - sampleRate, framesPerBuffer, numberOfBuffers, streamFlags, callback, userData ); - - - if( result == paNoError ) - ((PaStreamImplementation*)stream)->magic = PA_STREAM_MAGIC; - - return result; -} - - -PaError Pa_OpenDefaultStream( PortAudioStream** stream, - int numInputChannels, - int numOutputChannels, - PaSampleFormat sampleFormat, - double sampleRate, - unsigned long framesPerBuffer, - unsigned long numberOfBuffers, - PortAudioCallback *callback, - void *userData ) -{ - PaError result; - int inputDevice = driverModels[0]->getDefaultInputDeviceID; - int outputDevice = driverModels[0]->getDefaultOutputDeviceID; - - result = driverModels[0]->openStream( stream, inputDevice, numInputChannels, sampleFormat, 0, - outputDevice, numOutputChannels, sampleFormat, 0, - sampleRate, framesPerBuffer, numberOfBuffers, - streamFlags, callback, userData ); - - if( result == paNoError ) - ((PaStreamImplementation*)stream)->magic = PA_STREAM_MAGIC; - - return result; -} - - -PaError Pa_CloseStream( PortAudioStream* stream ) -{ - PA_CHECK_INITIALIZED; - - PaError result = ((PaStreamImplementation*)stream)->close(); - - if( result == PaNoError ) - ((PaStreamImplementation*)stream)->magic = 0; /* clear magic number */ - - return result; -} - - -PaError Pa_StartStream( PortAudioStream *stream ); -{ - PA_CHECK_INITIALIZED; - - return ((PaStreamImplementation*)stream)->start(); -} - - -PaError Pa_StopStream( PortAudioStream *stream ); -{ - PA_CHECK_INITIALIZED; - - return ((PaStreamImplementation*)stream)->stop(); -} - - -PaError Pa_AbortStream( PortAudioStream *stream ); -{ - PA_CHECK_INITIALIZED; - - return ((PaStreamImplementation*)stream)->abort(); -} - - -PaError Pa_StreamActive( PortAudioStream *stream ) -{ - PA_CHECK_INITIALIZED; - - return ((PaStreamImplementation*)stream)->active(); -} - -PaTimestamp Pa_StreamTime( PortAudioStream *stream ) -{ - PA_CHECK_INITIALIZED; - - return ((PaStreamImplementation*)stream)->time(); -} - - -double Pa_StreamCPULoad( PortAudioStream* stream ) -{ - PA_CHECK_INITIALIZED; - - return ((PaStreamImplementation*)stream)->cpuLoad(); -} - - - -int Pa_GetMinNumBuffers( PaDeviceID deviceID, int framesPerBuffer, double sampleRate ) -{ - PaDriverModelImplementation *impl; - PA_CHECK_INITIALIZED; - - ConvertPublicDeviceIDToImplementationDeviceID( impl, deviceID ); - if( impl == NULL ) - return paInvalidDeviceID; - - return impl->getMinNumBuffers( framesPerBuffer, sampleRate ); -} - - -void Pa_Sleep( long msec ) -{ - same as existing implementaion -} - - -PaError Pa_GetSampleSize( PaSampleFormat format ) -{ - same as existing implementation -} - -#endif /* PA_MULTIDRIVER */ - - diff --git a/docs/pa_drivermodel.h.txt b/docs/pa_drivermodel.h.txt deleted file mode 100644 index f3f2ca2..0000000 --- a/docs/pa_drivermodel.h.txt +++ /dev/null @@ -1,143 +0,0 @@ -#ifndef PA_MULTIDRIVERMODEL_H -#define PA_MULTIDRIVERMODEL_H - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - - -/* - This file contains the host-neutral code for implementing multiple driver model - support in PortAudio. - - It has not been compiled, but it is supplied only for example purposes at this stage. -*/ - - -#include "portaudio.h" - - -#define PA_MULTIDRIVER // for multidriver support - - - -TODO: declare function pointer types for the following function pointers - -/* - Each driver model implementation needs to implement an initialize function - which is added to the driverModelInitializers array in pa_multidrivermodel.c - - the initializer function needs to return a pointer to a - PaDriverModelImplementation structure, or NULL if initiliazation failed. TODO: need error code instead - - the function pointer members of this structure point to funtions - which operate in exactly the same way as the corresponding functions - in the PortAudio API. -*/ - -struct{ - fptr terminate; /* takes the PaDriverModelImplementation* returned by initialize */ - fptr getDriverModelInfo; - fptr getHostError; - fptr getHostErrorText; - fptr countDevices; - fptr getDefaultInputDeviceID; - fptr getDefaultOutputDeviceID; - fptr getDeviceInfo; - fptr openStream; - fptr getMinNumBuffers; -} PaDriverModelImplementation; - -/* - whenever an implementaion's openstream method is called it should return a - PortAudioStream* whose first segment is actually the following structure. - - the functions pointer members of this structure point to funcitons - which operate in exactly the same way as the corresponding functions - in the PortAudio API. -*/ -struct{ - unsigned long magic; - fptr close; - fptr start; - fptr stop; - fptr abort; - fptr active; - fptr time; - fptr cpuLoad; -} PaStreamImplementation; - -/* - Implementations should set magic to PA_STREAM_MAGIC when opening - a stream _and_ clear it to zero when closing a stream. - All functions which operate on streams should check the validity - of magic. -*/ - -#define PA_STREAM_MAGIC 0x12345678 - -#define PA_CHECK_STREAM( stream )\ - if( ((PaStreamImplementation*)stream)->magic != PA_STREAM_MAGIC )\ - return paBadStreamPtr; - - -/* - PA_API allows the same implementation to be used for single - driver model and multi-driver model operation. If - PA_MULTIDRIVER not defined, PA_API will declare api - functions as global, otherwise they will be static, and include - the drivermodel code. - - Usage would be something like: - - int PA_API(CountDevices)(); - - The PA_MULTIDRIVER_SUPPORT macro declares the initialization and - termination functions required by the multidriver support. it also - allocates and deallocates the PaDriverModelImplementation structure. - - TODO: add macros for initializing PaStreamImplementation PortAudioStream - these would be PA_INITIALIZE_STREAM and PA_TERMINATE_STREAM - they would assign and clear the magic number and assign the - interface functions if neceassary. -*/ - -#ifdef PA_MULTIDRIVER - -#define PA_API( model, name ) static Pa ## model ## _ ## name - -#define PA_MULTIDRIVER_SUPPORT( model )\ -PaError Pa_ ## model ## _MultiDriverTerminate( PaStreamImplementation *impl )\ -{\ - free( impl );\ - return Pa ## model ## _Terminate();\ -}\ -PaError Pa ## model ## _MultiDriverInitialize( PaStreamImplementation** impl )\ -{\ - PaError result = Pa ## model ## _Initialize();\ -\ - if( result == paNoError ){\ - *impl = malloc( sizeof( PaDriverModelImplementation ) );\ - if( impl == NULL ){\ - // TODO: call terminate, return an error - }else{\ - (*impl)->terminate = Pa ## model ## _MultiDriverTerminate();\ - (*impl)->getDriverModelInfo = Pa ## model ## _GetDriverModelInfo();\ - (*impl)->getHostError = Pa ## model ## _GetHostError();\ - // TODO: assign the rest of the interface functions - }\ - }\ - return result;\ -} - -#else /* !PA_MULTIDRIVER */ - -#define PA_API( model, name ) Pa_ ## name - -#define PA_MULTIDRIVER_SUPPORT - -#endif /* PA_MULTIDRIVER */ - - - -#endif /* PA_MULTIDRIVERMODEL_H */ diff --git a/docs/proposals.html b/docs/proposals.html index 7c0dc4fb99087f8435dae763778d511b581c4950..88dd2d07ce3ed33b6d0f92cc99ae31fb2c5a16b7 100644 GIT binary patch delta 297 zcmZvYze>bF7{uiek-aAnEQVAT$L*0ukR=fRKnjlwcnDUqCLd&Bvm3IT99BL=TESMk zdx2|w5i8%rJup^Q12cTT8NS!g!`<=rd-9^65ueWxFBUNb&l4uHI9XSOytR#WQafa_ zCoFAGrQjiCOf<J|c6jYP(e}^b-(d`}Sl{KiOL%oO0u`=+XVM9+i zb;{EW%0oFAyMeZa^i)Fn3pRYcpRsX9lnif^lVSUDq(@8eG_3ihUESZoQQK4d4^0`! l&|Y?$U}PQmQ6nFl5fsgt;7wo!xm;a8gfH-Hy}V7>!4GYJVz~eS literal 74012 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 g+;TGSu|LcGKf7$1_?EnA( -- 2.43.0