mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-23 17:30:02 +00:00
ALSA: firewire-lib: code refactoring for data block calculation
When calculating the number of data blocks per packet, some states are stored in AMDTP stream structure. This is inconvenient when reuse the calculation from non-stream structure. This commit applies refactoring to helper function for the calculation so that the function doesn't touch AMDTP stream structure. Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp> Link: https://lore.kernel.org/r/20200508043635.349339-8-o-takashi@sakamocchi.jp Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
816d84826e
commit
274fc35581
1 changed files with 19 additions and 14 deletions
|
@ -339,25 +339,26 @@ void amdtp_stream_pcm_prepare(struct amdtp_stream *s)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(amdtp_stream_pcm_prepare);
|
EXPORT_SYMBOL(amdtp_stream_pcm_prepare);
|
||||||
|
|
||||||
static unsigned int calculate_data_blocks(struct amdtp_stream *s,
|
static unsigned int calculate_data_blocks(unsigned int *data_block_state,
|
||||||
unsigned int syt)
|
bool is_blocking, bool is_no_info,
|
||||||
|
unsigned int syt_interval, enum cip_sfc sfc)
|
||||||
{
|
{
|
||||||
unsigned int phase, data_blocks;
|
unsigned int data_blocks;
|
||||||
|
|
||||||
/* Blocking mode. */
|
/* Blocking mode. */
|
||||||
if (s->flags & CIP_BLOCKING) {
|
if (is_blocking) {
|
||||||
/* This module generate empty packet for 'no data'. */
|
/* This module generate empty packet for 'no data'. */
|
||||||
if (syt == CIP_SYT_NO_INFO)
|
if (is_no_info)
|
||||||
data_blocks = 0;
|
data_blocks = 0;
|
||||||
else
|
else
|
||||||
data_blocks = s->syt_interval;
|
data_blocks = syt_interval;
|
||||||
/* Non-blocking mode. */
|
/* Non-blocking mode. */
|
||||||
} else {
|
} else {
|
||||||
if (!cip_sfc_is_base_44100(s->sfc)) {
|
if (!cip_sfc_is_base_44100(sfc)) {
|
||||||
// Sample_rate / 8000 is an integer, and precomputed.
|
// Sample_rate / 8000 is an integer, and precomputed.
|
||||||
data_blocks = s->ctx_data.rx.data_block_state;
|
data_blocks = *data_block_state;
|
||||||
} else {
|
} else {
|
||||||
phase = s->ctx_data.rx.data_block_state;
|
unsigned int phase = *data_block_state;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This calculates the number of data blocks per packet so that
|
* This calculates the number of data blocks per packet so that
|
||||||
|
@ -367,16 +368,16 @@ static unsigned int calculate_data_blocks(struct amdtp_stream *s,
|
||||||
* as possible in the sequence (to prevent underruns of the
|
* as possible in the sequence (to prevent underruns of the
|
||||||
* device's buffer).
|
* device's buffer).
|
||||||
*/
|
*/
|
||||||
if (s->sfc == CIP_SFC_44100)
|
if (sfc == CIP_SFC_44100)
|
||||||
/* 6 6 5 6 5 6 5 ... */
|
/* 6 6 5 6 5 6 5 ... */
|
||||||
data_blocks = 5 + ((phase & 1) ^
|
data_blocks = 5 + ((phase & 1) ^
|
||||||
(phase == 0 || phase >= 40));
|
(phase == 0 || phase >= 40));
|
||||||
else
|
else
|
||||||
/* 12 11 11 11 11 ... or 23 22 22 22 22 ... */
|
/* 12 11 11 11 11 ... or 23 22 22 22 22 ... */
|
||||||
data_blocks = 11 * (s->sfc >> 1) + (phase == 0);
|
data_blocks = 11 * (sfc >> 1) + (phase == 0);
|
||||||
if (++phase >= (80 >> (s->sfc >> 1)))
|
if (++phase >= (80 >> (sfc >> 1)))
|
||||||
phase = 0;
|
phase = 0;
|
||||||
s->ctx_data.rx.data_block_state = phase;
|
*data_block_state = phase;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -769,7 +770,11 @@ static void generate_ideal_pkt_descs(struct amdtp_stream *s,
|
||||||
} else {
|
} else {
|
||||||
desc->syt = syt_offset;
|
desc->syt = syt_offset;
|
||||||
}
|
}
|
||||||
desc->data_blocks = calculate_data_blocks(s, desc->syt);
|
desc->data_blocks =
|
||||||
|
calculate_data_blocks(&s->ctx_data.rx.data_block_state,
|
||||||
|
!!(s->flags & CIP_BLOCKING),
|
||||||
|
desc->syt == CIP_SYT_NO_INFO,
|
||||||
|
s->syt_interval, s->sfc);
|
||||||
|
|
||||||
if (s->flags & CIP_DBC_IS_END_EVENT)
|
if (s->flags & CIP_DBC_IS_END_EVENT)
|
||||||
dbc = (dbc + desc->data_blocks) & 0xff;
|
dbc = (dbc + desc->data_blocks) & 0xff;
|
||||||
|
|
Loading…
Reference in a new issue