Andrew Eikum : winealsa.drv: Special-case copying common sample sizes in a tight loop.
Alexandre Julliard
julliard at winehq.org
Wed Aug 22 14:04:19 CDT 2012
Module: wine
Branch: master
Commit: 19e9de7ddec82035aa645cd8c55690b7b2ca36d1
URL: http://source.winehq.org/git/wine.git/?a=commit;h=19e9de7ddec82035aa645cd8c55690b7b2ca36d1
Author: Andrew Eikum <aeikum at codeweavers.com>
Date: Tue Aug 21 13:38:44 2012 -0500
winealsa.drv: Special-case copying common sample sizes in a tight loop.
---
dlls/winealsa.drv/mmdevdrv.c | 57 +++++++++++++++++++++++++++++++++++++----
1 files changed, 51 insertions(+), 6 deletions(-)
diff --git a/dlls/winealsa.drv/mmdevdrv.c b/dlls/winealsa.drv/mmdevdrv.c
index 3a6bf33..6b2bed5 100644
--- a/dlls/winealsa.drv/mmdevdrv.c
+++ b/dlls/winealsa.drv/mmdevdrv.c
@@ -1828,22 +1828,67 @@ static BYTE *remap_channels(ACImpl *This, BYTE *buf, snd_pcm_uframes_t frames)
if(!This->remapping_buf){
This->remapping_buf = HeapAlloc(GetProcessHeap(), 0,
- (This->fmt->wBitsPerSample / 8) * This->alsa_channels * frames);
+ bytes_per_sample * This->alsa_channels * frames);
This->remapping_buf_frames = frames;
}else if(This->remapping_buf_frames < frames){
This->remapping_buf = HeapReAlloc(GetProcessHeap(), 0, This->remapping_buf,
- (This->fmt->wBitsPerSample / 8) * This->alsa_channels * frames);
+ bytes_per_sample * This->alsa_channels * frames);
This->remapping_buf_frames = frames;
}
snd_pcm_format_set_silence(This->alsa_format, This->remapping_buf,
frames * This->alsa_channels);
- for(i = 0; i < frames; ++i){
- for(c = 0; c < This->fmt->nChannels; ++c){
- memcpy(&This->remapping_buf[(i * This->alsa_channels + This->alsa_channel_map[c]) * bytes_per_sample],
- &buf[(i * This->fmt->nChannels + c) * bytes_per_sample], bytes_per_sample);
+ switch(This->fmt->wBitsPerSample){
+ case 8: {
+ UINT8 *tgt_buf, *src_buf;
+ tgt_buf = This->remapping_buf;
+ src_buf = buf;
+ for(i = 0; i < frames; ++i){
+ for(c = 0; c < This->fmt->nChannels; ++c)
+ tgt_buf[This->alsa_channel_map[c]] = src_buf[c];
+ tgt_buf += This->alsa_channels;
+ src_buf += This->fmt->nChannels;
+ }
+ break;
+ }
+ case 16: {
+ UINT16 *tgt_buf, *src_buf;
+ tgt_buf = (UINT16*)This->remapping_buf;
+ src_buf = (UINT16*)buf;
+ for(i = 0; i < frames; ++i){
+ for(c = 0; c < This->fmt->nChannels; ++c)
+ tgt_buf[This->alsa_channel_map[c]] = src_buf[c];
+ tgt_buf += This->alsa_channels;
+ src_buf += This->fmt->nChannels;
+ }
}
+ break;
+ case 32: {
+ UINT32 *tgt_buf, *src_buf;
+ tgt_buf = (UINT32*)This->remapping_buf;
+ src_buf = (UINT32*)buf;
+ for(i = 0; i < frames; ++i){
+ for(c = 0; c < This->fmt->nChannels; ++c)
+ tgt_buf[This->alsa_channel_map[c]] = src_buf[c];
+ tgt_buf += This->alsa_channels;
+ src_buf += This->fmt->nChannels;
+ }
+ }
+ break;
+ default: {
+ BYTE *tgt_buf, *src_buf;
+ tgt_buf = This->remapping_buf;
+ src_buf = buf;
+ for(i = 0; i < frames; ++i){
+ for(c = 0; c < This->fmt->nChannels; ++c)
+ memcpy(&tgt_buf[This->alsa_channel_map[c] * bytes_per_sample],
+ &src_buf[c * bytes_per_sample], bytes_per_sample);
+ tgt_buf += This->alsa_channels * bytes_per_sample;
+ src_buf += This->fmt->nChannels * bytes_per_sample;
+ }
+ }
+ break;
}
return This->remapping_buf;
More information about the wine-cvs
mailing list