Skip to contentSkip to conversation

cmipci - allow capture of raw spdif subframes

PATCH In review Timofei V. Bondarenko 2 participants 5 messages Nov 7, 2007 – Nov 13, 2007

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 cmipci - allow capture of raw spdif subframes

Hi.

Enable capturing of raw 32bit IEC958_SUBFRAME.

The 24-bits PCM data can be obtained using iec958 plugin.

Known problem: captured stream may begin with either left or right subframe. Since the iec958 plugin doesn't decode preamble it may swap the channels sometime.

Regards,
Tim.

#1 lore raw
Quoted 7 lines · Timofei V. Bondarenko

Hi.

Enable capturing of raw 32bit IEC958_SUBFRAME.

The 24-bits PCM data can be obtained using iec958 plugin.

Known problem: captured stream may begin with either left or right subframe. Since the iec958 plugin doesn't decode preamble it may swap the channels sometime.

Sorry, i've forgot to attach the patch...

alsa-kernel/pci/cmipci.c +8 -1
@@ -1400,6 +1407,11 @@ static int snd_cmipci_capture_spdif_prep
 		else
 			snd_cmipci_clear_bit(cm, CM_REG_CHFORMAT, CM_DBLSPDS);
 	}
+	if (snd_pcm_format_width(substream->runtime->format) > 16)
+		snd_cmipci_set_bit(cm, CM_REG_MISC_CTRL, CM_SPD32SEL);
+	else
+		snd_cmipci_clear_bit(cm, CM_REG_MISC_CTRL, CM_SPD32SEL);
+
 	spin_unlock_irq(&cm->reg_lock);
 
 	return snd_cmipci_pcm_prepare(cm, &cm->channel[CM_CH_CAPT], substream);
@@ -1411,6 +1423,7 @@ static int snd_cmipci_capture_spdif_hw_f
 
 	spin_lock_irq(&cm->reg_lock);
 	snd_cmipci_clear_bit(cm, CM_REG_FUNCTRL1, CM_CAPTURE_SPDF);
+	snd_cmipci_clear_bit(cm, CM_REG_MISC_CTRL, CM_SPD32SEL);
 	spin_unlock_irq(&cm->reg_lock);
 
 	return snd_cmipci_hw_free(subs);
@@ -1562,7 +1575,8 @@ static struct snd_pcm_hardware snd_cmipc
 	.info =			(SNDRV_PCM_INFO_MMAP | SNDRV_PCM_INFO_INTERLEAVED |
 				 SNDRV_PCM_INFO_BLOCK_TRANSFER | SNDRV_PCM_INFO_PAUSE |
 				 SNDRV_PCM_INFO_RESUME | SNDRV_PCM_INFO_MMAP_VALID),
-	.formats =	        SNDRV_PCM_FMTBIT_S16_LE,
+	.formats =	        SNDRV_PCM_FMTBIT_S16_LE |
+				SNDRV_PCM_FMTBIT_IEC958_SUBFRAME_LE,
 	.rates =		SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000,
 	.rate_min =		44100,
 	.rate_max =		48000,

_______________________________________________
Alsa-devel mailing list
[email protected]
http://mailman.alsa-project.org/mailman/listinfo/alsa-devel

#2 lore raw
In reply to Timofei V. Bondarenko

At Wed, 07 Nov 2007 15:12:46 +0300,

Quoted 5 lines · Timofei V. Bondarenko

Hi.

Enable capturing of raw 32bit IEC958_SUBFRAME.

Quoted 8 lines

The 24-bits PCM data can be obtained using iec958 plugin.

Known problem: captured stream may begin with either left or right subframe. Since the iec958 plugin doesn't decode preamble it may swap the channels sometime.

Regards,
Tim.

Applied this one, too.
(Do you happen to have a fix for iec958 plugin, too? :)

Thanks,

Takashi

#3 lore raw
Quoted 12 lines · Takashi Iwai

At Wed, 07 Nov 2007 15:12:46 +0300,

Quoted 10 lines · Timofei V. Bondarenko

Hi.

Enable capturing of raw 32bit IEC958_SUBFRAME.

The 24-bits PCM data can be obtained using iec958 plugin.

Known problem: captured stream may begin with either left or right subframe. Since the iec958 plugin doesn't decode preamble it may swap the channels sometime.

Quoted 5 lines
Quoted 2 lines

Regards,
Tim.

Applied this one, too.
(Do you happen to have a fix for iec958 plugin, too? :)

Not yet.
I'm in doubt about a clean way to drop one subframe from the raw stream. Could you give me a hint?

Regards,
Tim.

#4 lore raw

At Tue, 13 Nov 2007 16:47:38 +0300,

Quoted 17 lines · Timofei V. Bondarenko
Quoted 15 lines · Takashi Iwai

At Wed, 07 Nov 2007 15:12:46 +0300,

Quoted 12 lines · Timofei V. Bondarenko

Hi.

Enable capturing of raw 32bit IEC958_SUBFRAME.

The 24-bits PCM data can be obtained using iec958 plugin.

Known problem: captured stream may begin with either left or right subframe. Since the iec958 plugin doesn't decode preamble it may swap the channels sometime.

Regards,
Tim.

Quoted 6 lines
Quoted 2 lines

Applied this one, too.
(Do you happen to have a fix for iec958 plugin, too? :)

Not yet.
I'm in doubt about a clean way to drop one subframe from the raw stream. Could you give me a hint?

It'll be tricky, yes. We can prepend a zero in the first shot and keep one pending channel data to shift. For example,

  raw: R0 L0 R1 L1 R2 L2 ... R(n-1) L(n-1) | R(n) L(n) ... 
  dec: 0  R0 L0 R1 L1 R2 ... L(n-2) R(n-1) | L(n-1) R(n) ...

Takashi