[alsa-devel] [PATCH 2/4] ALSA: dice: handle whole available isochronous streams
Takashi Iwai
tiwai at suse.de
Wed Mar 9 16:29:47 CET 2016
On Mon, 07 Mar 2016 14:35:43 +0100,
Takashi Sakamoto wrote:
>
> This commit enables ALSA dice driver to handle whole available streams.
>
> In Dice, certain registers represent the number of available streams at
> current sampling transfer frequency for both directions. The parameters
> of each stream are represented in a block of register. This block is
> aligned sequentially. These streams start simultaneously by writing
> enable bit to a register.
>
> This commit operates these registers when starting/stopping streams.
>
> Signed-off-by: Takashi Sakamoto <o-takashi at sakamocchi.jp>
> ---
> sound/firewire/dice/dice-stream.c | 398 ++++++++++++++++++++++++--------------
> 1 file changed, 255 insertions(+), 143 deletions(-)
>
> diff --git a/sound/firewire/dice/dice-stream.c b/sound/firewire/dice/dice-stream.c
> index 15d581d..2077f18 100644
> --- a/sound/firewire/dice/dice-stream.c
> +++ b/sound/firewire/dice/dice-stream.c
> @@ -65,85 +65,84 @@ static int ensure_phase_lock(struct snd_dice *dice)
> return 0;
> }
>
> -static void release_resources(struct snd_dice *dice,
> - struct fw_iso_resources *resources)
> +static int get_register_params(struct snd_dice *dice, unsigned int params[4])
> {
> - __be32 channel;
> -
> - /* Reset channel number */
> - channel = cpu_to_be32((u32)-1);
> - if (resources == &dice->tx_resources[0])
> - snd_dice_transaction_write_tx(dice, TX_ISOCHRONOUS,
> - &channel, sizeof(channel));
> - else
> - snd_dice_transaction_write_rx(dice, RX_ISOCHRONOUS,
> - &channel, sizeof(channel));
> -
> - fw_iso_resources_free(resources);
> -}
> -
> -static int keep_resources(struct snd_dice *dice,
> - struct fw_iso_resources *resources,
> - unsigned int max_payload_bytes)
> -{
> - __be32 channel;
> + __be32 reg[2];
> int err;
>
> - err = fw_iso_resources_allocate(resources, max_payload_bytes,
> - fw_parent_device(dice->unit)->max_speed);
> + err = snd_dice_transaction_read_tx(dice, TX_NUMBER, reg, sizeof(reg));
> if (err < 0)
> - goto end;
> + return err;
> + params[0] = min_t(unsigned int, be32_to_cpu(reg[0]), MAX_STREAMS);
> + params[1] = be32_to_cpu(reg[1]) * 4;
>
> - /* Set channel number */
> - channel = cpu_to_be32(resources->channel);
> - if (resources == &dice->tx_resources[0])
> - err = snd_dice_transaction_write_tx(dice, TX_ISOCHRONOUS,
> - &channel, sizeof(channel));
> - else
> - err = snd_dice_transaction_write_rx(dice, RX_ISOCHRONOUS,
> - &channel, sizeof(channel));
> + err = snd_dice_transaction_read_rx(dice, RX_NUMBER, reg, sizeof(reg));
> if (err < 0)
> - release_resources(dice, resources);
> -end:
> - return err;
> + return err;
> + params[2] = min_t(unsigned int, be32_to_cpu(reg[0]), MAX_STREAMS);
> + params[3] = be32_to_cpu(reg[1]) * 4;
These "parameters" are not necessarily an array since each field has a
strict definition. A more readable code would be to define a struct
instead.
thanks,
Takashi
More information about the Alsa-devel
mailing list