|
@@ -72,15 +72,15 @@ static struct {
|
|
|
[FRONT] = { .create = ct_alsa_pcm_create,
|
|
|
.destroy = NULL,
|
|
|
.public_name = "Front/WaveIn"},
|
|
|
- [REAR] = { .create = ct_alsa_pcm_create,
|
|
|
+ [SURROUND] = { .create = ct_alsa_pcm_create,
|
|
|
.destroy = NULL,
|
|
|
- .public_name = "Rear"},
|
|
|
+ .public_name = "Surround"},
|
|
|
[CLFE] = { .create = ct_alsa_pcm_create,
|
|
|
.destroy = NULL,
|
|
|
.public_name = "Center/LFE"},
|
|
|
- [SURROUND] = { .create = ct_alsa_pcm_create,
|
|
|
+ [SIDE] = { .create = ct_alsa_pcm_create,
|
|
|
.destroy = NULL,
|
|
|
- .public_name = "Surround"},
|
|
|
+ .public_name = "Side"},
|
|
|
[IEC958] = { .create = ct_alsa_pcm_create,
|
|
|
.destroy = NULL,
|
|
|
.public_name = "IEC958 Non-audio"},
|
|
@@ -119,7 +119,6 @@ atc_pcm_release_resources(struct ct_atc *atc, struct ct_atc_pcm *apcm);
|
|
|
|
|
|
static int ct_map_audio_buffer(struct ct_atc *atc, struct ct_atc_pcm *apcm)
|
|
|
{
|
|
|
- unsigned long flags;
|
|
|
struct snd_pcm_runtime *runtime;
|
|
|
struct ct_vm *vm;
|
|
|
|
|
@@ -129,9 +128,7 @@ static int ct_map_audio_buffer(struct ct_atc *atc, struct ct_atc_pcm *apcm)
|
|
|
runtime = apcm->substream->runtime;
|
|
|
vm = atc->vm;
|
|
|
|
|
|
- spin_lock_irqsave(&atc->vm_lock, flags);
|
|
|
- apcm->vm_block = vm->map(vm, runtime->dma_area, runtime->dma_bytes);
|
|
|
- spin_unlock_irqrestore(&atc->vm_lock, flags);
|
|
|
+ apcm->vm_block = vm->map(vm, apcm->substream, runtime->dma_bytes);
|
|
|
|
|
|
if (NULL == apcm->vm_block)
|
|
|
return -ENOENT;
|
|
@@ -141,7 +138,6 @@ static int ct_map_audio_buffer(struct ct_atc *atc, struct ct_atc_pcm *apcm)
|
|
|
|
|
|
static void ct_unmap_audio_buffer(struct ct_atc *atc, struct ct_atc_pcm *apcm)
|
|
|
{
|
|
|
- unsigned long flags;
|
|
|
struct ct_vm *vm;
|
|
|
|
|
|
if (NULL == apcm->vm_block)
|
|
@@ -149,9 +145,7 @@ static void ct_unmap_audio_buffer(struct ct_atc *atc, struct ct_atc_pcm *apcm)
|
|
|
|
|
|
vm = atc->vm;
|
|
|
|
|
|
- spin_lock_irqsave(&atc->vm_lock, flags);
|
|
|
vm->unmap(vm, apcm->vm_block);
|
|
|
- spin_unlock_irqrestore(&atc->vm_lock, flags);
|
|
|
|
|
|
apcm->vm_block = NULL;
|
|
|
}
|
|
@@ -161,9 +155,7 @@ static unsigned long atc_get_ptp_phys(struct ct_atc *atc, int index)
|
|
|
struct ct_vm *vm;
|
|
|
void *kvirt_addr;
|
|
|
unsigned long phys_addr;
|
|
|
- unsigned long flags;
|
|
|
|
|
|
- spin_lock_irqsave(&atc->vm_lock, flags);
|
|
|
vm = atc->vm;
|
|
|
kvirt_addr = vm->get_ptp_virt(vm, index);
|
|
|
if (kvirt_addr == NULL)
|
|
@@ -171,8 +163,6 @@ static unsigned long atc_get_ptp_phys(struct ct_atc *atc, int index)
|
|
|
else
|
|
|
phys_addr = virt_to_phys(kvirt_addr);
|
|
|
|
|
|
- spin_unlock_irqrestore(&atc->vm_lock, flags);
|
|
|
-
|
|
|
return phys_addr;
|
|
|
}
|
|
|
|
|
@@ -180,16 +170,15 @@ static unsigned int convert_format(snd_pcm_format_t snd_format)
|
|
|
{
|
|
|
switch (snd_format) {
|
|
|
case SNDRV_PCM_FORMAT_U8:
|
|
|
- case SNDRV_PCM_FORMAT_S8:
|
|
|
return SRC_SF_U8;
|
|
|
case SNDRV_PCM_FORMAT_S16_LE:
|
|
|
- case SNDRV_PCM_FORMAT_U16_LE:
|
|
|
return SRC_SF_S16;
|
|
|
case SNDRV_PCM_FORMAT_S24_3LE:
|
|
|
return SRC_SF_S24;
|
|
|
- case SNDRV_PCM_FORMAT_S24_LE:
|
|
|
case SNDRV_PCM_FORMAT_S32_LE:
|
|
|
return SRC_SF_S32;
|
|
|
+ case SNDRV_PCM_FORMAT_FLOAT_LE:
|
|
|
+ return SRC_SF_F32;
|
|
|
default:
|
|
|
printk(KERN_ERR "ctxfi: not recognized snd format is %d \n",
|
|
|
snd_format);
|
|
@@ -264,6 +253,9 @@ static int atc_pcm_playback_prepare(struct ct_atc *atc, struct ct_atc_pcm *apcm)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+ /* first release old resources */
|
|
|
+ atc->pcm_release_resources(atc, apcm);
|
|
|
+
|
|
|
/* Get SRC resource */
|
|
|
desc.multi = apcm->substream->runtime->channels;
|
|
|
desc.msr = atc->msr;
|
|
@@ -506,6 +498,9 @@ atc_pcm_capture_get_resources(struct ct_atc *atc, struct ct_atc_pcm *apcm)
|
|
|
int n_srcimp = 0, n_amixer = 0, n_srcc = 0, n_sum = 0;
|
|
|
struct src_node_conf_t src_node_conf[2] = {{0} };
|
|
|
|
|
|
+ /* first release old resources */
|
|
|
+ atc->pcm_release_resources(atc, apcm);
|
|
|
+
|
|
|
/* The numbers of converting SRCs and SRCIMPs should be determined
|
|
|
* by pitch value. */
|
|
|
|
|
@@ -777,6 +772,9 @@ static int spdif_passthru_playback_get_resources(struct ct_atc *atc,
|
|
|
int n_amixer = apcm->substream->runtime->channels, i = 0;
|
|
|
unsigned int pitch = 0, rsr = atc->pll_rate;
|
|
|
|
|
|
+ /* first release old resources */
|
|
|
+ atc->pcm_release_resources(atc, apcm);
|
|
|
+
|
|
|
/* Get SRC resource */
|
|
|
desc.multi = apcm->substream->runtime->channels;
|
|
|
desc.msr = 1;
|
|
@@ -1562,7 +1560,6 @@ int ct_atc_create(struct snd_card *card, struct pci_dev *pci,
|
|
|
atc_set_ops(atc);
|
|
|
|
|
|
spin_lock_init(&atc->atc_lock);
|
|
|
- spin_lock_init(&atc->vm_lock);
|
|
|
|
|
|
/* Find card model */
|
|
|
err = atc_identify_card(atc);
|