1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-06-15 15:49:36 +02:00

Recreate and apply portmixer patch

This commit is contained in:
Leland Lucius 2019-12-15 02:33:25 -06:00
parent ff8053e7e8
commit 493a60298f
11 changed files with 204 additions and 1306 deletions

View File

@ -87,6 +87,22 @@ typedef struct PaWinDirectSoundStreamInfo{
}PaWinDirectSoundStreamInfo;
/** Retrieve the GUID of the input device.
@param stream The stream to query.
@return A pointer to the GUID, or NULL if none.
*/
LPGUID PaWinDS_GetStreamInputGUID( PaStream* s );
/** Retrieve the GUID of the output device.
@param stream The stream to query.
@return A pointer to the GUID, or NULL if none.
*/
LPGUID PaWinDS_GetStreamOutputGUID( PaStream* s );
#ifdef __cplusplus
}

View File

@ -548,6 +548,22 @@ PaError PaWasapi_SetDefaultInterfaceId( unsigned short *pId, int bOutput );
*/
PaError PaWasapi_SetStreamStateHandler( PaStream *pStream, PaWasapiStreamStateCallback fnStateHandler, void *pUserData );
/** Returns Windows device ID for input stream
@param pStream Pointer to PaStream to query.
@return non-null value pointing to static device ID
*/
const wchar_t *PaWasapi_GetInputDeviceID( PaStream *s );
/** Returns Windows device ID for output stream
@param pStream Pointer to PaStream to query.
@return non-null value pointing to static device ID
*/
const wchar_t *PaWasapi_GetOutputDeviceID( PaStream *s );
/*
IMPORTANT:

View File

@ -1197,6 +1197,15 @@ signed long Pa_GetStreamReadAvailable( PaStream* stream );
signed long Pa_GetStreamWriteAvailable( PaStream* stream );
/** Retrieve the host type handling an open stream.
@return Returns a non-negative value representing the host API type
handling an open stream or, a PaErrorCode (which are always negative)
if PortAudio is not initialized or an error is encountered.
*/
PaHostApiTypeId Pa_GetStreamHostApiType( PaStream* stream );
/* Miscellaneous utilities */

View File

@ -1257,8 +1257,10 @@ PaError Pa_OpenStream( PaStream** stream,
hostApiInputParametersPtr, hostApiOutputParametersPtr,
sampleRate, framesPerBuffer, streamFlags, streamCallback, userData );
if( result == paNoError )
if( result == paNoError ) {
AddOpenStream( *stream );
PA_STREAM_REP(*stream)->hostApiType = hostApi->info.type;
}
PA_LOGAPI(("Pa_OpenStream returned:\n" ));
@ -1770,6 +1772,32 @@ signed long Pa_GetStreamWriteAvailable( PaStream* stream )
return result;
}
PaHostApiTypeId Pa_GetStreamHostApiType( PaStream* stream )
{
PaError error = PaUtil_ValidateStreamPointer( stream );
PaHostApiTypeId result;
#ifdef PA_LOG_API_CALLS
PaUtil_DebugPrint("Pa_GetStreamHostApiType called:\n" );
PaUtil_DebugPrint("\tPaStream* stream: 0x%p\n", stream );
#endif
if( error == paNoError )
{
result = PA_STREAM_REP(stream)->hostApiType;
}
else
{
result = (PaHostApiTypeId) error;
}
#ifdef PA_LOG_API_CALLS
PaUtil_DebugPrint("Pa_GetStreamHostApiType returned:\n" );
PaUtil_DebugPrint("\tPaError: %d ( %s )\n\n", result, Pa_GetErrorText( result ) );
#endif
return result;
}
PaError Pa_GetSampleSize( PaSampleFormat format )
{

View File

@ -93,6 +93,8 @@ void PaUtil_InitializeStreamRepresentation( PaUtilStreamRepresentation *streamRe
streamRepresentation->streamInfo.inputLatency = 0.;
streamRepresentation->streamInfo.outputLatency = 0.;
streamRepresentation->streamInfo.sampleRate = 0.;
streamRepresentation->hostApiType = 0;
}

View File

@ -152,6 +152,7 @@ typedef struct PaUtilStreamRepresentation {
PaStreamFinishedCallback *streamFinishedCallback;
void *userData;
PaStreamInfo streamInfo;
PaHostApiTypeId hostApiType;
} PaUtilStreamRepresentation;

View File

@ -621,6 +621,7 @@ typedef struct
StreamDirection streamDir;
snd_pcm_channel_area_t *channelAreas; /* Needed for channel adaption */
int card;
} PaAlsaStreamComponent;
/* Implementation specific stream structure */
@ -1874,6 +1875,7 @@ static PaError PaAlsaStreamComponent_Initialize( PaAlsaStreamComponent *self, Pa
PaError result = paNoError;
PaSampleFormat userSampleFormat = params->sampleFormat, hostSampleFormat = paNoError;
assert( params->channelCount > 0 );
snd_pcm_info_t* pcmInfo;
/* Make sure things have an initial value */
memset( self, 0, sizeof (PaAlsaStreamComponent) );
@ -1902,6 +1904,9 @@ static PaError PaAlsaStreamComponent_Initialize( PaAlsaStreamComponent *self, Pa
PA_ENSURE( AlsaOpen( &alsaApi->baseHostApiRep, params, streamDir, &self->pcm ) );
self->nfds = alsa_snd_pcm_poll_descriptors_count( self->pcm );
snd_pcm_info_alloca( &pcmInfo );
self->card = snd_pcm_info_get_card( pcmInfo );
PA_ENSURE( hostSampleFormat = PaUtil_SelectClosestAvailableFormat( GetAvailableFormats( self->pcm ), userSampleFormat ) );
self->hostSampleFormat = hostSampleFormat;
@ -4605,9 +4610,7 @@ PaError PaAlsa_GetStreamInputCard( PaStream* s, int* card )
/* XXX: More descriptive error? */
PA_UNLESS( stream->capture.pcm, paDeviceUnavailable );
alsa_snd_pcm_info_alloca( &pcmInfo );
PA_ENSURE( alsa_snd_pcm_info( stream->capture.pcm, pcmInfo ) );
*card = alsa_snd_pcm_info_get_card( pcmInfo );
*card = stream->capture.card;
error:
return result;
@ -4624,9 +4627,7 @@ PaError PaAlsa_GetStreamOutputCard( PaStream* s, int* card )
/* XXX: More descriptive error? */
PA_UNLESS( stream->playback.pcm, paDeviceUnavailable );
alsa_snd_pcm_info_alloca( &pcmInfo );
PA_ENSURE( alsa_snd_pcm_info( stream->playback.pcm, pcmInfo ) );
*card = alsa_snd_pcm_info_get_card( pcmInfo );
*card = stream->capture.card;
error:
return result;

View File

@ -257,6 +257,7 @@ typedef struct PaWinDsStream
#endif
/* Output */
LPGUID pOutputGuid;
LPDIRECTSOUND pDirectSound;
LPDIRECTSOUNDBUFFER pDirectSoundPrimaryBuffer;
LPDIRECTSOUNDBUFFER pDirectSoundOutputBuffer;
@ -272,6 +273,7 @@ typedef struct PaWinDsStream
INT finalZeroBytesWritten; /* used to determine when we've flushed the whole buffer */
/* Input */
LPGUID pInputGuid;
LPDIRECTSOUNDCAPTURE pDirectSoundCapture;
LPDIRECTSOUNDCAPTUREBUFFER pDirectSoundInputBuffer;
INT inputFrameSizeBytes;
@ -1885,8 +1887,8 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi,
PaWinDsDeviceInfo *inputWinDsDeviceInfo, *outputWinDsDeviceInfo;
PaDeviceInfo *inputDeviceInfo, *outputDeviceInfo;
int inputChannelCount, outputChannelCount;
PaSampleFormat inputSampleFormat, outputSampleFormat;
PaSampleFormat hostInputSampleFormat, hostOutputSampleFormat;
PaSampleFormat inputSampleFormat = 0, outputSampleFormat = 0;
PaSampleFormat hostInputSampleFormat = 0, hostOutputSampleFormat = 0;
int userRequestedHostInputBufferSizeFrames = 0;
int userRequestedHostOutputBufferSizeFrames = 0;
unsigned long suggestedInputLatencyFrames, suggestedOutputLatencyFrames;
@ -2177,6 +2179,13 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi,
goto error;
}
/* Portmixer support - fill in the GUID of the output stream */
stream->pOutputGuid = outputWinDsDeviceInfo->lpGUID;
if( stream->pOutputGuid == NULL )
{
stream->pOutputGuid = (GUID *) &DSDEVID_DefaultPlayback;
}
/* Calculate value used in latency calculation to avoid real-time divides. */
stream->secondsPerHostByte = 1.0 /
(stream->bufferProcessor.bytesPerHostOutputSample *
@ -2218,6 +2227,13 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi,
result = paBufferTooBig;
goto error;
}
/* Portmixer support - store the GUID of the input stream */
stream->pInputGuid = inputWinDsDeviceInfo->lpGUID;
if( stream->pInputGuid == NULL )
{
stream->pInputGuid = (GUID *)&DSDEVID_DefaultCapture;
}
}
/* open/create the DirectSound buffers */
@ -2261,6 +2277,12 @@ static PaError OpenStream( struct PaUtilHostApiRepresentation *hostApi,
if( outputParameters && !stream->pDirectSoundOutputBuffer )
{
stream->pOutputGuid = outputWinDsDeviceInfo->lpGUID;
if( stream->pOutputGuid == NULL )
{
stream->pOutputGuid = (GUID *) &DSDEVID_DefaultPlayback;
}
hr = InitOutputBuffer( stream,
(PaWinDsDeviceInfo*)hostApi->deviceInfos[outputParameters->device],
hostOutputSampleFormat,
@ -3269,3 +3291,18 @@ static signed long GetStreamWriteAvailable( PaStream* s )
return 0;
}
/***********************************************************************************/
LPGUID PaWinDS_GetStreamInputGUID( PaStream* s )
{
PaWinDsStream *stream = (PaWinDsStream*)s;
return stream->pInputGuid;
}
/***********************************************************************************/
LPGUID PaWinDS_GetStreamOutputGUID( PaStream* s )
{
PaWinDsStream *stream = (PaWinDsStream*)s;
return stream->pOutputGuid;
}

View File

@ -2043,3 +2043,26 @@ error:
#endif
}
const char *PaOSS_GetStreamInputDevice( PaStream* s )
{
PaOssStream *stream = (PaOssStream*)s;
if( stream->capture )
{
return stream->capture->devName;
}
return NULL;
}
const char *PaOSS_GetStreamOutputDevice( PaStream* s )
{
PaOssStream *stream = (PaOssStream*)s;
if( stream->playback )
{
return stream->playback->devName;
}
return NULL;
}

View File

@ -5283,6 +5283,32 @@ PaError PaWasapi_SetStreamStateHandler( PaStream *pStream, PaWasapiStreamStateCa
return paNoError;
}
// ------------------------------------------------------------------------------------------
const wchar_t *PaWasapi_GetInputDeviceID( PaStream *s )
{
PaWasapiStream *stream = (PaWasapiStream *)s;
if (stream == NULL)
return NULL;
if (stream->in.params.device_info)
return stream->in.params.device_info->szDeviceID;
return NULL;
}
// ------------------------------------------------------------------------------------------
const wchar_t *PaWasapi_GetOutputDeviceID( PaStream *s )
{
PaWasapiStream *stream = (PaWasapiStream *)s;
if (stream == NULL)
return NULL;
if (stream->out.params.device_info)
return stream->out.params.device_info->szDeviceID;
return NULL;
}
// ------------------------------------------------------------------------------------------
HRESULT _PollGetOutputFramesAvailable(PaWasapiStream *stream, UINT32 *available)
{

File diff suppressed because it is too large Load Diff