[alsa-devel] sbxfi - What works/doesn't summary
Takashi Iwai
tiwai at suse.de
Wed Oct 29 10:29:10 CET 2008
At Wed, 29 Oct 2008 08:15:04 +0300,
The Source wrote:
>
> Ok, was able to get hw_params:
> access: MMAP_INTERLEAVED
> format: S16_LE
> subformat: STD
> channels: 2
> rate: 48000 (48000/1)
> period_size: 1088
> buffer_size: 4352
>
> Why so weird values?
Maybe related with the default sample rate 44.1kHz? Who knows...
Does the patch below have any influence?
This restricts the period/buffer size aligned to 1024 bytes.
Also, it may fix the PCM pointer calculation somehow.
Takashi
---
diff --git a/sound/pci/sbxfi/sbxfi.c b/sound/pci/sbxfi/sbxfi.c
index e67f768..a2d908e 100644
--- a/sound/pci/sbxfi/sbxfi.c
+++ b/sound/pci/sbxfi/sbxfi.c
@@ -122,6 +122,9 @@ struct sbxfi_port {
/* TLB entry */
int tlb_index;
unsigned int tlb_pages;
+ /* buffer pointers */
+ unsigned int start_addr;
+ unsigned int buffer_bytes;
/* status */
int state;
int need_update;
@@ -527,8 +530,8 @@ static void sbxfi_playback_start(struct sbxfi *chip, struct sbxfi_port *port)
if (port->tlb_index < 0)
return;
runtime = port->substream->runtime;
- start = port->tlb_index * SBXFI_PAGE_SIZE;
- loop = start + frames_to_bytes(runtime, runtime->buffer_size);
+ start = port->start_addr;
+ loop = start + port->buffer_bytes;
switch (runtime->rate) {
case 48000:
@@ -579,8 +582,8 @@ static void sbxfi_capture_start(struct sbxfi *chip, struct sbxfi_port *port)
if (port->tlb_index < 0)
return;
runtime = port->substream->runtime;
- start = port->tlb_index * SBXFI_PAGE_SIZE;
- loop = start + frames_to_bytes(runtime, runtime->buffer_size);
+ start = port->start_addr;
+ loop = start + port->buffer_bytes;
switch (runtime->rate) {
case 48000:
@@ -1320,9 +1323,9 @@ static int sbxfi_playback_open(struct snd_pcm_substream *substream)
set_rate_limit(chip, runtime);
snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS);
snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_BUFFER_BYTES,
- 128);
+ 1024 /*128*/);
snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_BYTES,
- 128);
+ 1024 /*128*/);
return 0;
}
@@ -1349,9 +1352,9 @@ static int sbxfi_capture_open(struct snd_pcm_substream *substream)
set_rate_limit(chip, runtime);
snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS);
snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_BUFFER_BYTES,
- 128);
+ 1024 /*128*/);
snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_BYTES,
- 128);
+ 1024 /*128*/);
return 0;
}
@@ -1399,6 +1402,9 @@ static int sbxfi_playback_prepare(struct snd_pcm_substream *substream)
port->frag_count = runtime->period_size;
port->need_update = 0;
+ port->start_addr = port->tlb_index * SBXFI_PAGE_SIZE;
+ port->buffer_bytes = frames_to_bytes(runtime, runtime->buffer_size);
+
sbxfi_setup_play_pitch(chip, port);
sbxfi_setup_play_mixer(chip, port);
sbxfi_setup_play_mapper(chip, port);
@@ -1417,6 +1423,9 @@ static int sbxfi_capture_prepare(struct snd_pcm_substream *substream)
port->frag_count = runtime->period_size;
port->need_update = 0;
+ port->start_addr = port->tlb_index * SBXFI_PAGE_SIZE;
+ port->buffer_bytes = frames_to_bytes(runtime, runtime->buffer_size);
+
sbxfi_init_adc(chip, chip->capsrc, chip->micboost);
sbxfi_setup_capture_mapper(chip, port);
@@ -1477,10 +1486,12 @@ sbxfi_pcm_pointer(struct snd_pcm_substream *substream)
unsigned int pos;
pos = sbxfi_read(chip, SRCCA(port->src[0])) & 0x03ffffff;
- pos -= port->tlb_index * SBXFI_PAGE_SIZE;
+ pos -= port->start_addr;
/* The pointer is always 128 bytes ahead */
if (pos >= CA_OFFSET)
pos -= CA_OFFSET;
+ else
+ pos = pos + port->buffer_bytes - CA_OFFSET;
pos = bytes_to_frames(runtime, pos);
pos %= runtime->buffer_size;
LOG(2, "POINTER = 0x%x\n", pos);
More information about the Alsa-devel
mailing list