[alsa-devel] [PATCH] ALSA: dice: drop duplex streams synchronization to transfer own time stamps

Takashi Iwai tiwai at suse.de
Sun Feb 28 10:56:52 CET 2016


On Sat, 27 Feb 2016 13:01:21 +0100,
Takashi Sakamoto wrote:
> 
> This commit drops implementation of duplex streams synchronization
> from ALSA dice driver, due to a reason of hardware design. This patch
> allows dice-based units to generate sounds correctly when isochronous
> packet streaming starts at first time.
> 
> In IEC 61883-6:2005, CIP packetization layer for AM824 data format
> utilizes the value of SYT field in CIP header of received packet for
> a reference to phase lock loop. Figure 3 in clause 4.3 describes it.
> The value is an offset from cycle_time field of every cycle start packet
> from cycle master on IEEE 1394 bus. The time calculated with these two
> fields is called as 'presentation timestamp' which represents the time
> to play data included in the packet.
> 
> Although, this idea includes some problems due to accuracy of timekeep in
> cycle master, accuracy of transmission of cycle start packet on the bus
> with the other units, accuracy of sampling clock in data transmitter side
> and accuracy of replay in data receiver side. In most case, these
> accuracies somewhat worse because there's no such ideal hardwares in this
> world.
> 
> For the issues, ASICs for Dice include Jitter Elimination Technologies
> (JET) PLL. The PLL can handle several sources of clock and compensate it
> with high-precision internal clock source. The sequence of value in syt
> field of received AMDTP packets is one of the sources, therefore
> transmitters on IEEE 1394 bus should transfer it.
> 
> On the other hand, current ALSA dice driver is programmed with a mode of
> duplex streams with synchronization. In this mode, the driver outputs
> packets after some incoming packets are handled, to re-use the value of
> SYT field in incoming packets to the value for outgoing packets. This mode
> is enabled when source signal of sampling clock is set to internal, and
> this is a major use case. Thus, in most cases, the unit receives no packets
> during a short time after packet streaming starts.
> 
> As long as I experienced, this causes the units to generate no sounds at
> first time to receive packets. This issue occurs only with Dice II. I guess
> this is due to a quirk of the PLL. In short, the PLL cannot generate firm
> signals to ADCs/DACs or the other ICs when no packets are received in the
> beginning of packet streaming. While, on second time or later, the unit
> generates sound correctly. I guess that starting packet streaming at first
> time sets the PLL correctly.
> 
> Well, still based on my hypothesis and no way to prove it, this commit
> drops duplex streams synchronization from this driver. At least, the PLL
> requires the sequence of value in SYT field of received AMDTP packets as
> one of source of clock signals with internal clock source.
> 
> Signed-off-by: Takashi Sakamoto <o-takashi at sakamocchi.jp>

Applied, thanks.


Takashi

> ---
>  sound/firewire/dice/dice-stream.c | 42 ++-------------------------------------
>  1 file changed, 2 insertions(+), 40 deletions(-)
> 
> diff --git a/sound/firewire/dice/dice-stream.c b/sound/firewire/dice/dice-stream.c
> index a64b3cc..df035b1 100644
> --- a/sound/firewire/dice/dice-stream.c
> +++ b/sound/firewire/dice/dice-stream.c
> @@ -191,53 +191,17 @@ end:
>  	return err;
>  }
>  
> -static int get_sync_mode(struct snd_dice *dice, enum cip_flags *sync_mode)
> -{
> -	u32 source;
> -	int err;
> -
> -	err = snd_dice_transaction_get_clock_source(dice, &source);
> -	if (err < 0)
> -		goto end;
> -
> -	switch (source) {
> -	/* So-called 'SYT Match' modes, sync_to_syt value of packets received */
> -	case CLOCK_SOURCE_ARX4:	/* in 4th stream */
> -	case CLOCK_SOURCE_ARX3:	/* in 3rd stream */
> -	case CLOCK_SOURCE_ARX2:	/* in 2nd stream */
> -		err = -ENOSYS;
> -		break;
> -	case CLOCK_SOURCE_ARX1:	/* in 1st stream, which this driver uses */
> -		*sync_mode = 0;
> -		break;
> -	default:
> -		*sync_mode = CIP_SYNC_TO_DEVICE;
> -		break;
> -	}
> -end:
> -	return err;
> -}
> -
>  int snd_dice_stream_start_duplex(struct snd_dice *dice, unsigned int rate)
>  {
>  	struct amdtp_stream *master, *slave;
>  	unsigned int curr_rate;
> -	enum cip_flags sync_mode;
>  	int err = 0;
>  
>  	if (dice->substreams_counter == 0)
>  		goto end;
>  
> -	err = get_sync_mode(dice, &sync_mode);
> -	if (err < 0)
> -		goto end;
> -	if (sync_mode == CIP_SYNC_TO_DEVICE) {
> -		master = &dice->tx_stream;
> -		slave  = &dice->rx_stream;
> -	} else {
> -		master = &dice->rx_stream;
> -		slave  = &dice->tx_stream;
> -	}
> +	master = &dice->rx_stream;
> +	slave  = &dice->tx_stream;
>  
>  	/* Some packet queueing errors. */
>  	if (amdtp_streaming_error(master) || amdtp_streaming_error(slave))
> @@ -261,8 +225,6 @@ int snd_dice_stream_start_duplex(struct snd_dice *dice, unsigned int rate)
>  		stop_stream(dice, slave);
>  		snd_dice_transaction_clear_enable(dice);
>  
> -		amdtp_stream_set_sync(sync_mode, master, slave);
> -
>  		err = ensure_phase_lock(dice);
>  		if (err < 0) {
>  			dev_err(&dice->unit->device,
> -- 
> 2.5.0
> 


More information about the Alsa-devel mailing list