Re: ALSA-LIB: Support for format IEC958_SUBFRAME_LE in the plug plugin?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 07. 02. 24 16:34, Pavel Hofman wrote:

But honestly I still do not understand what it actually does and what is
the goal of snd_pcm_plug_slave_format().

Without that I cannot modify snd_pcm_plug_slave_format() correctly to
incorporate support for IEC958.

I believe you're looking to a wrong place. Here's incomplete code:

==========
diff --git a/configure.ac b/configure.ac
index 7a152a4a..3f238302 100644
--- a/configure.ac
+++ b/configure.ac
@@ -642,6 +642,9 @@ fi
 if test "$build_pcm_alaw" = "yes"; then
   AC_DEFINE([BUILD_PCM_PLUGIN_ALAW], "1", [Build PCM alaw plugin])
 fi
+if test "$build_pcm_iec958" = "yes"; then
+  AC_DEFINE([BUILD_PCM_PLUGIN_IEC958], "1", [Build PCM iec958 plugin])
+fi
 if test "$build_pcm_mmap_emul" = "yes"; then
   AC_DEFINE([BUILD_PCM_PLUGIN_MMAP_EMUL], "1", [Build PCM mmap-emul plugin])
 fi
diff --git a/include/pcm_plugin.h b/include/pcm_plugin.h
index 2d014394..f3e8f3b5 100644
--- a/include/pcm_plugin.h
+++ b/include/pcm_plugin.h
@@ -133,6 +133,19 @@ int _snd_pcm_adpcm_open(snd_pcm_t **pcmp, const char *name,
 			snd_config_t *root, snd_config_t *conf,
 			snd_pcm_stream_t stream, int mode);
+/*
+ *  IEC958 subframe conversion plugin
+ */
+int snd_pcm_iec958_open(snd_pcm_t **pcmp, const char *name,
+			snd_pcm_format_t sformat, snd_pcm_t *slave,
+			int close_slave,
+			const unsigned char *status_bits,
+			const unsigned char *preamble_vals,
+			int hdmi_mode);
+int _snd_pcm_iec958_open(snd_pcm_t **pcmp, const char *name,
+			 snd_config_t *root, snd_config_t *conf,
+			 snd_pcm_stream_t stream, int mode);
+
 /*
  *  Route plugin for linear formats
  */
diff --git a/src/pcm/pcm_plug.c b/src/pcm/pcm_plug.c
index e5a3a189..287fb9f9 100644
--- a/src/pcm/pcm_plug.c
+++ b/src/pcm/pcm_plug.c
@@ -186,7 +186,8 @@ static const snd_pcm_format_t linear_preferred_formats[] = {
#if defined(BUILD_PCM_PLUGIN_MULAW) || \
 	defined(BUILD_PCM_PLUGIN_ALAW) || \
-	defined(BUILD_PCM_PLUGIN_ADPCM)
+	defined(BUILD_PCM_PLUGIN_ADPCM) || \
+	defined(BUILD_PCM_PLUGIN_IEC958)
 #define BUILD_PCM_NONLINEAR
 #endif
@@ -201,6 +202,10 @@ static const snd_pcm_format_t nonlinear_preferred_formats[] = {
 #ifdef BUILD_PCM_PLUGIN_ADPCM
 	SND_PCM_FORMAT_IMA_ADPCM,
 #endif
+#ifdef BUILD_PCM_PLUGIN_IEC958
+	SND_PCM_FORMAT_IEC958_SUBFRAME_LE,
+	SND_PCM_FORMAT_IEC958_SUBFRAME_BE,
+#endif
 };
 #endif
@@ -490,6 +495,18 @@ static int snd_pcm_plug_change_channels(snd_pcm_t *pcm, snd_pcm_t **new, snd_pcm
 }
 #endif
+#ifdef BUILD_PCM_PLUGIN_IEC958
+static int iec958_open(snd_pcm_t **pcmp, const char *name,
+		       snd_pcm_format_t sformat, snd_pcm_t *slave,
+		       int close_slave)
+{
+	unsigned char preamble_vals[3] = {
+	      0x08, 0x02, 0x04 /* Z, X, Y */
+        };
+	return snd_pcm_iec958_open(pcmp, name, sformat, slave, close_slave, NULL, preamble_vals, 0);
+}
+#endif
+
 static int snd_pcm_plug_change_format(snd_pcm_t *pcm, snd_pcm_t **new, snd_pcm_plug_params_t *clt, snd_pcm_plug_params_t *slv)
 {
 	snd_pcm_plug_t *plug = pcm->private_data;
@@ -526,6 +543,12 @@ static int snd_pcm_plug_change_format(snd_pcm_t *pcm, snd_pcm_t **new, snd_pcm_p
 		case SND_PCM_FORMAT_IMA_ADPCM:
 			f = snd_pcm_adpcm_open;
 			break;
+#endif
+#ifdef BUILD_PCM_PLUGIN_IEC958
+		case SND_PCM_FORMAT_IEC958_SUBFRAME_LE:
+		case SND_PCM_FORMAT_IEC958_SUBFRAME_BE:
+			f = iec958_open;
+			break;
 #endif
 		default:
 #ifdef BUILD_PCM_PLUGIN_LFLOAT
@@ -566,6 +589,12 @@ static int snd_pcm_plug_change_format(snd_pcm_t *pcm, snd_pcm_t **new, snd_pcm_p
 		case SND_PCM_FORMAT_IMA_ADPCM:
 			f = snd_pcm_adpcm_open;
 			break;
+#endif
+#ifdef BUILD_PCM_PLUGIN_IEC958
+		case SND_PCM_FORMAT_IEC958_SUBFRAME_LE:
+		case SND_PCM_FORMAT_IEC958_SUBFRAME_BE:
+			f = iec958_open;
+			break;
 #endif
 		default:
 			return -EINVAL;
=========

Test:

========= ~/.asoundrc
pcm.test123 {
  type plug
  slave {
    pcm null
    format IEC958_SUBFRAME_LE
  }
}
=========

$ LD_PRELOAD=~/alsa/alsa-lib/src/.libs/libasound.so aplay -v -D test123 /dev/zero
Playing raw data '/dev/zero' : Unsigned 8 bit, Rate 8000 Hz, Mono
Plug PCM: IEC958 subframe conversion PCM (IEC958_SUBFRAME_LE)
Its setup is:
  stream       : PLAYBACK
  access       : RW_INTERLEAVED
  format       : U8
  subformat    : STD
  channels     : 1
  rate         : 8000
  exact rate   : 8000 (8000/1)
  msbits       : 8
  buffer_size  : 4000
  period_size  : 1000
  period_time  : 125000
  tstamp_mode  : ENABLE
  tstamp_type  : GETTIMEOFDAY
  period_step  : 1
  avail_min    : 1000
  period_event : 0
  start_threshold  : 4000
  stop_threshold   : 4000
  silence_threshold: 0
  silence_size : 0
  boundary     : 9007199254740992000
Slave: Null PCM
Its setup is:
  stream       : PLAYBACK
  access       : MMAP_INTERLEAVED
  format       : IEC958_SUBFRAME_LE
  subformat    : STD
  channels     : 1
  rate         : 8000
  exact rate   : 8000 (8000/1)
  msbits       : 32
  buffer_size  : 4000
  period_size  : 1000
  period_time  : 125000
  tstamp_mode  : ENABLE
  tstamp_type  : GETTIMEOFDAY
  period_step  : 1
  avail_min    : 1000
  period_event : 0
  start_threshold  : 4000
  stop_threshold   : 4000
  silence_threshold: 0
  silence_size : 0
  boundary     : 9007199254740992000

							Jaroslav

--
Jaroslav Kysela <perex@xxxxxxxx>
Linux Sound Maintainer; ALSA Project; Red Hat, Inc.




[Index of Archives]     [ALSA User]     [Linux Audio Users]     [Pulse Audio]     [Kernel Archive]     [Asterisk PBX]     [Photo Sharing]     [Linux Sound]     [Video 4 Linux]     [Gimp]     [Yosemite News]

  Powered by Linux