[PATCH 6/8] wineoss: Don't cache the oss_audioinfo in the client.
Andrew Eikum
aeikum at codeweavers.com
Mon Apr 11 09:00:11 CDT 2022
Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>
On Wed, Apr 06, 2022 at 07:55:56AM +0100, Huw Davies wrote:
> The retrieval on endpoint creation is left in for debugging
> purposes.
>
> Signed-off-by: Huw Davies <huw at codeweavers.com>
> ---
> dlls/wineoss.drv/mmdevdrv.c | 53 +++++++++++++++++++++----------------
> 1 file changed, 30 insertions(+), 23 deletions(-)
>
> diff --git a/dlls/wineoss.drv/mmdevdrv.c b/dlls/wineoss.drv/mmdevdrv.c
> index 242d2e0b359..990429156bc 100644
> --- a/dlls/wineoss.drv/mmdevdrv.c
> +++ b/dlls/wineoss.drv/mmdevdrv.c
> @@ -113,8 +113,6 @@ struct ACImpl {
> UINT32 channel_count;
> struct oss_stream *stream;
>
> - oss_audioinfo ai;
> -
> BOOL initted;
> HANDLE timer;
>
> @@ -433,6 +431,7 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev,
> {
> ACImpl *This;
> struct oss_stream *stream;
> + oss_audioinfo ai;
> const OSSDevice *oss_dev;
> HRESULT hr;
> int len;
> @@ -475,8 +474,8 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev,
>
> This->dataflow = oss_dev->flow;
>
> - This->ai.dev = -1;
> - if(ioctl(stream->fd, SNDCTL_ENGINEINFO, &This->ai) < 0){
> + ai.dev = -1;
> + if(ioctl(stream->fd, SNDCTL_ENGINEINFO, &ai) < 0){
> WARN("Unable to get audio info for device %s: %d (%s)\n", oss_dev->devnode,
> errno, strerror(errno));
> close(stream->fd);
> @@ -488,17 +487,17 @@ HRESULT WINAPI AUDDRV_GetAudioEndpoint(GUID *guid, IMMDevice *dev,
> strcpy(This->devnode, oss_dev->devnode);
>
> TRACE("OSS audioinfo:\n");
> - TRACE("devnode: %s\n", This->ai.devnode);
> - TRACE("name: %s\n", This->ai.name);
> - TRACE("busy: %x\n", This->ai.busy);
> - TRACE("caps: %x\n", This->ai.caps);
> - TRACE("iformats: %x\n", This->ai.iformats);
> - TRACE("oformats: %x\n", This->ai.oformats);
> - TRACE("enabled: %d\n", This->ai.enabled);
> - TRACE("min_rate: %d\n", This->ai.min_rate);
> - TRACE("max_rate: %d\n", This->ai.max_rate);
> - TRACE("min_channels: %d\n", This->ai.min_channels);
> - TRACE("max_channels: %d\n", This->ai.max_channels);
> + TRACE("devnode: %s\n", ai.devnode);
> + TRACE("name: %s\n", ai.name);
> + TRACE("busy: %x\n", ai.busy);
> + TRACE("caps: %x\n", ai.caps);
> + TRACE("iformats: %x\n", ai.iformats);
> + TRACE("oformats: %x\n", ai.oformats);
> + TRACE("enabled: %d\n", ai.enabled);
> + TRACE("min_rate: %d\n", ai.min_rate);
> + TRACE("max_rate: %d\n", ai.max_rate);
> + TRACE("min_channels: %d\n", ai.min_channels);
> + TRACE("max_channels: %d\n", ai.max_channels);
>
> This->IAudioClient3_iface.lpVtbl = &AudioClient3_Vtbl;
> This->IAudioRenderClient_iface.lpVtbl = &AudioRenderClient_Vtbl;
> @@ -1129,6 +1128,7 @@ static HRESULT WINAPI AudioClient_GetMixFormat(IAudioClient3 *iface,
> {
> ACImpl *This = impl_from_IAudioClient3(iface);
> WAVEFORMATEXTENSIBLE *fmt;
> + oss_audioinfo ai;
> int formats;
>
> TRACE("(%p)->(%p)\n", This, pwfx);
> @@ -1137,10 +1137,17 @@ static HRESULT WINAPI AudioClient_GetMixFormat(IAudioClient3 *iface,
> return E_POINTER;
> *pwfx = NULL;
>
> + ai.dev = -1;
> + if(ioctl(This->stream->fd, SNDCTL_ENGINEINFO, &ai) < 0){
> + WARN("Unable to get audio info for device %s: %d (%s)\n", This->devnode,
> + errno, strerror(errno));
> + return E_FAIL;
> + }
> +
> if(This->dataflow == eRender)
> - formats = This->ai.oformats;
> + formats = ai.oformats;
> else if(This->dataflow == eCapture)
> - formats = This->ai.iformats;
> + formats = ai.iformats;
> else
> return E_UNEXPECTED;
>
> @@ -1174,7 +1181,7 @@ static HRESULT WINAPI AudioClient_GetMixFormat(IAudioClient3 *iface,
>
> /* some OSS drivers are buggy, so set reasonable defaults if
> * the reported values seem wacky */
> - fmt->Format.nChannels = max(This->ai.max_channels, This->ai.min_channels);
> + fmt->Format.nChannels = max(ai.max_channels, ai.min_channels);
> if(fmt->Format.nChannels == 0 || fmt->Format.nChannels > 8)
> fmt->Format.nChannels = 2;
>
> @@ -1185,7 +1192,7 @@ static HRESULT WINAPI AudioClient_GetMixFormat(IAudioClient3 *iface,
> * channels (e.g. 2.1). */
> if(fmt->Format.nChannels > 1 && (fmt->Format.nChannels & 0x1))
> {
> - if(fmt->Format.nChannels < This->ai.max_channels)
> + if(fmt->Format.nChannels < ai.max_channels)
> fmt->Format.nChannels += 1;
> else
> /* We could "fake" more channels and downmix the emulated channels,
> @@ -1194,12 +1201,12 @@ static HRESULT WINAPI AudioClient_GetMixFormat(IAudioClient3 *iface,
> WARN("Some Windows applications behave badly with an odd number of channels (%u)!\n", fmt->Format.nChannels);
> }
>
> - if(This->ai.max_rate == 0)
> + if(ai.max_rate == 0)
> fmt->Format.nSamplesPerSec = 44100;
> else
> - fmt->Format.nSamplesPerSec = min(This->ai.max_rate, 44100);
> - if(fmt->Format.nSamplesPerSec < This->ai.min_rate)
> - fmt->Format.nSamplesPerSec = This->ai.min_rate;
> + fmt->Format.nSamplesPerSec = min(ai.max_rate, 44100);
> + if(fmt->Format.nSamplesPerSec < ai.min_rate)
> + fmt->Format.nSamplesPerSec = ai.min_rate;
>
> fmt->dwChannelMask = get_channel_mask(fmt->Format.nChannels);
>
> --
> 2.25.1
>
>
More information about the wine-devel
mailing list