diff options
Diffstat (limited to 'sound/core/oss/pcm_oss.c')
| -rw-r--r-- | sound/core/oss/pcm_oss.c | 51 | 
1 files changed, 28 insertions, 23 deletions
diff --git a/sound/core/oss/pcm_oss.c b/sound/core/oss/pcm_oss.c index a2e4eb32469..23c34a02894 100644 --- a/sound/core/oss/pcm_oss.c +++ b/sound/core/oss/pcm_oss.c @@ -41,6 +41,7 @@  #include <sound/info.h>  #include <linux/soundcard.h>  #include <sound/initval.h> +#include <sound/mixer_oss.h>  #define OSS_ALSAEMULVER		_SIOR ('M', 249, int) @@ -60,7 +61,6 @@ MODULE_PARM_DESC(nonblock_open, "Don't block opening busy PCM devices.");  MODULE_ALIAS_SNDRV_MINOR(SNDRV_MINOR_OSS_PCM);  MODULE_ALIAS_SNDRV_MINOR(SNDRV_MINOR_OSS_PCM1); -extern int snd_mixer_oss_ioctl_card(struct snd_card *card, unsigned int cmd, unsigned long arg);  static int snd_pcm_oss_get_rate(struct snd_pcm_oss_file *pcm_oss_file);  static int snd_pcm_oss_get_channels(struct snd_pcm_oss_file *pcm_oss_file);  static int snd_pcm_oss_get_format(struct snd_pcm_oss_file *pcm_oss_file); @@ -656,7 +656,7 @@ snd_pcm_uframes_t get_hw_ptr_period(struct snd_pcm_runtime *runtime)  #define AFMT_AC3         0x00000400  #define AFMT_VORBIS      0x00000800 -static int snd_pcm_oss_format_from(int format) +static snd_pcm_format_t snd_pcm_oss_format_from(int format)  {  	switch (format) {  	case AFMT_MU_LAW:	return SNDRV_PCM_FORMAT_MU_LAW; @@ -680,7 +680,7 @@ static int snd_pcm_oss_format_from(int format)  	}  } -static int snd_pcm_oss_format_to(int format) +static int snd_pcm_oss_format_to(snd_pcm_format_t format)  {  	switch (format) {  	case SNDRV_PCM_FORMAT_MU_LAW:	return AFMT_MU_LAW; @@ -843,7 +843,8 @@ static int snd_pcm_oss_change_params(struct snd_pcm_substream *substream)  	size_t oss_frame_size;  	int err;  	int direct; -	int format, sformat, n; +	snd_pcm_format_t format, sformat; +	int n;  	struct snd_mask sformat_mask;  	struct snd_mask mask; @@ -868,11 +869,11 @@ static int snd_pcm_oss_change_params(struct snd_pcm_substream *substream)  	_snd_pcm_hw_param_min(sparams, SNDRV_PCM_HW_PARAM_PERIODS, 2, 0);  	snd_mask_none(&mask);  	if (atomic_read(&substream->mmap_count)) -		snd_mask_set(&mask, SNDRV_PCM_ACCESS_MMAP_INTERLEAVED); +		snd_mask_set(&mask, (__force int)SNDRV_PCM_ACCESS_MMAP_INTERLEAVED);  	else { -		snd_mask_set(&mask, SNDRV_PCM_ACCESS_RW_INTERLEAVED); +		snd_mask_set(&mask, (__force int)SNDRV_PCM_ACCESS_RW_INTERLEAVED);  		if (!direct) -			snd_mask_set(&mask, SNDRV_PCM_ACCESS_RW_NONINTERLEAVED); +			snd_mask_set(&mask, (__force int)SNDRV_PCM_ACCESS_RW_NONINTERLEAVED);  	}  	err = snd_pcm_hw_param_mask(substream, sparams, SNDRV_PCM_HW_PARAM_ACCESS, &mask);  	if (err < 0) { @@ -891,19 +892,22 @@ static int snd_pcm_oss_change_params(struct snd_pcm_substream *substream)  	else  		sformat = snd_pcm_plug_slave_format(format, &sformat_mask); -	if (sformat < 0 || !snd_mask_test(&sformat_mask, sformat)) { -		for (sformat = 0; sformat <= SNDRV_PCM_FORMAT_LAST; sformat++) { -			if (snd_mask_test(&sformat_mask, sformat) && +	if ((__force int)sformat < 0 || +	    !snd_mask_test(&sformat_mask, (__force int)sformat)) { +		for (sformat = (__force snd_pcm_format_t)0; +		     (__force int)sformat <= (__force int)SNDRV_PCM_FORMAT_LAST; +		     sformat = (__force snd_pcm_format_t)((__force int)sformat + 1)) { +			if (snd_mask_test(&sformat_mask, (__force int)sformat) &&  			    snd_pcm_oss_format_to(sformat) >= 0)  				break;  		} -		if (sformat > SNDRV_PCM_FORMAT_LAST) { +		if ((__force int)sformat > (__force int)SNDRV_PCM_FORMAT_LAST) {  			snd_printd("Cannot find a format!!!\n");  			err = -EINVAL;  			goto failure;  		}  	} -	err = _snd_pcm_hw_param_set(sparams, SNDRV_PCM_HW_PARAM_FORMAT, sformat, 0); +	err = _snd_pcm_hw_param_set(sparams, SNDRV_PCM_HW_PARAM_FORMAT, (__force int)sformat, 0);  	if (err < 0)  		goto failure; @@ -912,9 +916,9 @@ static int snd_pcm_oss_change_params(struct snd_pcm_substream *substream)  	} else {  		_snd_pcm_hw_params_any(params);  		_snd_pcm_hw_param_set(params, SNDRV_PCM_HW_PARAM_ACCESS, -				      SNDRV_PCM_ACCESS_RW_INTERLEAVED, 0); +				      (__force int)SNDRV_PCM_ACCESS_RW_INTERLEAVED, 0);  		_snd_pcm_hw_param_set(params, SNDRV_PCM_HW_PARAM_FORMAT, -				      snd_pcm_oss_format_from(runtime->oss.format), 0); +				      (__force int)snd_pcm_oss_format_from(runtime->oss.format), 0);  		_snd_pcm_hw_param_set(params, SNDRV_PCM_HW_PARAM_CHANNELS,  				      runtime->oss.channels, 0);  		_snd_pcm_hw_param_set(params, SNDRV_PCM_HW_PARAM_RATE, @@ -1185,10 +1189,10 @@ snd_pcm_sframes_t snd_pcm_oss_write3(struct snd_pcm_substream *substream, const  		if (in_kernel) {  			mm_segment_t fs;  			fs = snd_enter_user(); -			ret = snd_pcm_lib_write(substream, (void __user *)ptr, frames); +			ret = snd_pcm_lib_write(substream, (void __force __user *)ptr, frames);  			snd_leave_user(fs);  		} else { -			ret = snd_pcm_lib_write(substream, (void __user *)ptr, frames); +			ret = snd_pcm_lib_write(substream, (void __force __user *)ptr, frames);  		}  		if (ret != -EPIPE && ret != -ESTRPIPE)  			break; @@ -1230,10 +1234,10 @@ snd_pcm_sframes_t snd_pcm_oss_read3(struct snd_pcm_substream *substream, char *p  		if (in_kernel) {  			mm_segment_t fs;  			fs = snd_enter_user(); -			ret = snd_pcm_lib_read(substream, (void __user *)ptr, frames); +			ret = snd_pcm_lib_read(substream, (void __force __user *)ptr, frames);  			snd_leave_user(fs);  		} else { -			ret = snd_pcm_lib_read(substream, (void __user *)ptr, frames); +			ret = snd_pcm_lib_read(substream, (void __force __user *)ptr, frames);  		}  		if (ret == -EPIPE) {  			if (runtime->status->state == SNDRV_PCM_STATE_DRAINING) { @@ -1333,7 +1337,7 @@ static ssize_t snd_pcm_oss_write2(struct snd_pcm_substream *substream, const cha  		struct snd_pcm_plugin_channel *channels;  		size_t oss_frame_bytes = (runtime->oss.plugin_first->src_width * runtime->oss.plugin_first->src_format.channels) / 8;  		if (!in_kernel) { -			if (copy_from_user(runtime->oss.buffer, (const char __user *)buf, bytes)) +			if (copy_from_user(runtime->oss.buffer, (const char __force __user *)buf, bytes))  				return -EFAULT;  			buf = runtime->oss.buffer;  		} @@ -1429,7 +1433,7 @@ static ssize_t snd_pcm_oss_read2(struct snd_pcm_substream *substream, char *buf,  	struct snd_pcm_runtime *runtime = substream->runtime;  	snd_pcm_sframes_t frames, frames1;  #ifdef CONFIG_SND_PCM_OSS_PLUGINS -	char __user *final_dst = (char __user *)buf; +	char __user *final_dst = (char __force __user *)buf;  	if (runtime->oss.plugin_first) {  		struct snd_pcm_plugin_channel *channels;  		size_t oss_frame_bytes = (runtime->oss.plugin_last->dst_width * runtime->oss.plugin_last->dst_format.channels) / 8; @@ -1549,6 +1553,7 @@ static int snd_pcm_oss_sync1(struct snd_pcm_substream *substream, size_t size)  {  	struct snd_pcm_runtime *runtime;  	ssize_t result = 0; +	snd_pcm_state_t state;  	long res;  	wait_queue_t wait; @@ -1570,9 +1575,9 @@ static int snd_pcm_oss_sync1(struct snd_pcm_substream *substream, size_t size)  		result = 0;  		set_current_state(TASK_INTERRUPTIBLE);  		snd_pcm_stream_lock_irq(substream); -		res = runtime->status->state; +		state = runtime->status->state;  		snd_pcm_stream_unlock_irq(substream); -		if (res != SNDRV_PCM_STATE_RUNNING) { +		if (state != SNDRV_PCM_STATE_RUNNING) {  			set_current_state(TASK_RUNNING);  			break;  		} @@ -1658,7 +1663,7 @@ static int snd_pcm_oss_sync(struct snd_pcm_oss_file *pcm_oss_file)  								   size1);  					size1 /= runtime->channels; /* frames */  					fs = snd_enter_user(); -					snd_pcm_lib_write(substream, (void __user *)runtime->oss.buffer, size1); +					snd_pcm_lib_write(substream, (void __force __user *)runtime->oss.buffer, size1);  					snd_leave_user(fs);  				}  			} else if (runtime->access == SNDRV_PCM_ACCESS_RW_NONINTERLEAVED) {  |