⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sb8_main.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 2 页
字号:
		snd_sbdsp_command(chip, SB_DSP_BLOCK_SIZE);		snd_sbdsp_command(chip, count & 0xff);		snd_sbdsp_command(chip, count >> 8);	}	spin_unlock_irqrestore(&chip->reg_lock, flags);	snd_dma_program(chip->dma8, runtime->dma_addr,			size, DMA_MODE_READ | DMA_AUTOINIT);	return 0;}static int snd_sb8_capture_trigger(snd_pcm_substream_t * substream,				   int cmd){	unsigned long flags;	sb_t *chip = snd_pcm_substream_chip(substream);	unsigned int count;	spin_lock_irqsave(&chip->reg_lock, flags);	switch (cmd) {	case SNDRV_PCM_TRIGGER_START:		snd_sbdsp_command(chip, chip->capture_format);		if (chip->capture_format == SB_DSP_INPUT) {			count = chip->c_period_size - 1;			snd_sbdsp_command(chip, count & 0xff);			snd_sbdsp_command(chip, count >> 8);		}		break;	case SNDRV_PCM_TRIGGER_STOP:		if (chip->capture_format == SB_DSP_HI_INPUT_AUTO) {			snd_pcm_runtime_t *runtime = substream->runtime;			snd_sbdsp_reset(chip);			if (runtime->channels > 1) {				/* restore input filter status */				spin_lock(&chip->mixer_lock);				snd_sbmixer_write(chip, SB_DSP_CAPTURE_FILT, chip->force_mode16);				spin_unlock(&chip->mixer_lock);				/* set hardware to mono mode */				snd_sbdsp_command(chip, SB_DSP_MONO_8BIT);			}		} else {			snd_sbdsp_command(chip, SB_DSP_DMA8_OFF);		}		snd_sbdsp_command(chip, SB_DSP_SPEAKER_OFF);	}	spin_unlock_irqrestore(&chip->reg_lock, flags);	chip->mode = (cmd == SNDRV_PCM_TRIGGER_START) ? SB_MODE_CAPTURE_8 : SB_MODE_HALT;	return 0;}irqreturn_t snd_sb8dsp_interrupt(sb_t *chip){	snd_pcm_substream_t *substream;	snd_pcm_runtime_t *runtime;	snd_sb_ack_8bit(chip);	switch (chip->mode) {	case SB_MODE_PLAYBACK_8:	/* ok.. playback is active */		substream = chip->playback_substream;		runtime = substream->runtime;		if (chip->playback_format == SB_DSP_OUTPUT)		    	snd_sb8_playback_trigger(substream, SNDRV_PCM_TRIGGER_START);		snd_pcm_period_elapsed(substream);		break;	case SB_MODE_CAPTURE_8:		substream = chip->capture_substream;		runtime = substream->runtime;		if (chip->capture_format == SB_DSP_INPUT)		    	snd_sb8_capture_trigger(substream, SNDRV_PCM_TRIGGER_START);		snd_pcm_period_elapsed(substream);		break;	}	return IRQ_HANDLED;}static snd_pcm_uframes_t snd_sb8_playback_pointer(snd_pcm_substream_t * substream){	sb_t *chip = snd_pcm_substream_chip(substream);	size_t ptr;	if (chip->mode != SB_MODE_PLAYBACK_8)		return 0;	ptr = snd_dma_pointer(chip->dma8, chip->p_dma_size);	return bytes_to_frames(substream->runtime, ptr);}static snd_pcm_uframes_t snd_sb8_capture_pointer(snd_pcm_substream_t * substream){	sb_t *chip = snd_pcm_substream_chip(substream);	size_t ptr;	if (chip->mode != SB_MODE_CAPTURE_8)		return 0;	ptr = snd_dma_pointer(chip->dma8, chip->c_dma_size);	return bytes_to_frames(substream->runtime, ptr);}/* */static snd_pcm_hardware_t snd_sb8_playback ={	.info =			(SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED |				 SNDRV_PCM_INFO_MMAP_VALID),	.formats =		 SNDRV_PCM_FMTBIT_U8,	.rates =		(SNDRV_PCM_RATE_CONTINUOUS | SNDRV_PCM_RATE_8000 |				 SNDRV_PCM_RATE_11025 | SNDRV_PCM_RATE_22050),	.rate_min =		4000,	.rate_max =		23000,	.channels_min =		1,	.channels_max =		1,	.buffer_bytes_max =	65536,	.period_bytes_min =	64,	.period_bytes_max =	65536,	.periods_min =		1,	.periods_max =		1024,	.fifo_size =		0,};static snd_pcm_hardware_t snd_sb8_capture ={	.info =			(SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED |				 SNDRV_PCM_INFO_MMAP_VALID),	.formats =		SNDRV_PCM_FMTBIT_U8,	.rates =		(SNDRV_PCM_RATE_CONTINUOUS | SNDRV_PCM_RATE_8000 |				 SNDRV_PCM_RATE_11025),	.rate_min =		4000,	.rate_max =		13000,	.channels_min =		1,	.channels_max =		1,	.buffer_bytes_max =	65536,	.period_bytes_min =	64,	.period_bytes_max =	65536,	.periods_min =		1,	.periods_max =		1024,	.fifo_size =		0,};/* * */ static int snd_sb8_open(snd_pcm_substream_t *substream){	sb_t *chip = snd_pcm_substream_chip(substream);	snd_pcm_runtime_t *runtime = substream->runtime;	unsigned long flags;	spin_lock_irqsave(&chip->open_lock, flags);	if (chip->open) {		spin_unlock_irqrestore(&chip->open_lock, flags);		return -EAGAIN;	}	chip->open |= SB_OPEN_PCM;	spin_unlock_irqrestore(&chip->open_lock, flags);	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {		chip->playback_substream = substream;		runtime->hw = snd_sb8_playback;	} else {		chip->capture_substream = substream;		runtime->hw = snd_sb8_capture;	}	switch (chip->hardware) {	case SB_HW_PRO:		runtime->hw.rate_max = 44100;		runtime->hw.channels_max = 2;		snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,				    snd_sb8_hw_constraint_rate_channels, NULL,				    SNDRV_PCM_HW_PARAM_CHANNELS,				    SNDRV_PCM_HW_PARAM_RATE, -1);		snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,				     snd_sb8_hw_constraint_channels_rate, NULL,				     SNDRV_PCM_HW_PARAM_RATE, -1);		break;	case SB_HW_201:		if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {			runtime->hw.rate_max = 44100;		} else {			runtime->hw.rate_max = 15000;		}	default:		break;	}	snd_pcm_hw_constraint_ratnums(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,				      &hw_constraints_clock);	return 0;	}static int snd_sb8_close(snd_pcm_substream_t *substream){	unsigned long flags;	sb_t *chip = snd_pcm_substream_chip(substream);	chip->playback_substream = NULL;	chip->capture_substream = NULL;	spin_lock_irqsave(&chip->open_lock, flags);	chip->open &= ~SB_OPEN_PCM;	spin_unlock_irqrestore(&chip->open_lock, flags);	return 0;}/* *  Initialization part */ static snd_pcm_ops_t snd_sb8_playback_ops = {	.open =			snd_sb8_open,	.close =		snd_sb8_close,	.ioctl =		snd_pcm_lib_ioctl,	.hw_params =		snd_sb8_hw_params,	.hw_free =		snd_sb8_hw_free,	.prepare =		snd_sb8_playback_prepare,	.trigger =		snd_sb8_playback_trigger,	.pointer =		snd_sb8_playback_pointer,};static snd_pcm_ops_t snd_sb8_capture_ops = {	.open =			snd_sb8_open,	.close =		snd_sb8_close,	.ioctl =		snd_pcm_lib_ioctl,	.hw_params =		snd_sb8_hw_params,	.hw_free =		snd_sb8_hw_free,	.prepare =		snd_sb8_capture_prepare,	.trigger =		snd_sb8_capture_trigger,	.pointer =		snd_sb8_capture_pointer,};static void snd_sb8dsp_pcm_free(snd_pcm_t *pcm){	snd_pcm_lib_preallocate_free_for_all(pcm);}int snd_sb8dsp_pcm(sb_t *chip, int device, snd_pcm_t ** rpcm){	snd_card_t *card = chip->card;	snd_pcm_t *pcm;	int err;	if (rpcm)		*rpcm = NULL;	if ((err = snd_pcm_new(card, "SB8 DSP", device, 1, 1, &pcm)) < 0)		return err;	sprintf(pcm->name, "DSP v%i.%i", chip->version >> 8, chip->version & 0xff);	pcm->info_flags = SNDRV_PCM_INFO_HALF_DUPLEX;	pcm->private_data = chip;	pcm->private_free = snd_sb8dsp_pcm_free;	snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_PLAYBACK, &snd_sb8_playback_ops);	snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &snd_sb8_capture_ops);	snd_pcm_lib_preallocate_pages_for_all(pcm, SNDRV_DMA_TYPE_DEV,					      snd_dma_isa_data(),					      64*1024, 64*1024);	if (rpcm)		*rpcm = pcm;	return 0;}EXPORT_SYMBOL(snd_sb8dsp_pcm);EXPORT_SYMBOL(snd_sb8dsp_interrupt);  /* sb8_midi.c */EXPORT_SYMBOL(snd_sb8dsp_midi_interrupt);EXPORT_SYMBOL(snd_sb8dsp_midi);/* *  INIT part */static int __init alsa_sb8_init(void){	return 0;}static void __exit alsa_sb8_exit(void){}module_init(alsa_sb8_init)module_exit(alsa_sb8_exit)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -