* Fix by Cyan: Do the offset calculation taking the rate base into account.

Fixes using the HDA driver with frame rates based on 44100Hz.
* Automatic white space cleanup.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@30704 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Stephan Aßmus
2009-05-11 08:05:51 +00:00
parent 2a2eb31535
commit 94aabcd393
@@ -449,9 +449,9 @@ hda_stream_new(hda_audio_group* audioGroup, int type)
return stream; return stream;
} }
dprintf("hda: hda_audio_group_get_widgets failed for %s stream\n", dprintf("hda: hda_audio_group_get_widgets failed for %s stream\n",
type == STREAM_PLAYBACK ? " playback" : "record"); type == STREAM_PLAYBACK ? " playback" : "record");
free(stream); free(stream);
return NULL; return NULL;
} }
@@ -512,7 +512,7 @@ hda_stream_setup_buffers(hda_audio_group* audioGroup, hda_stream* stream,
corb_t verb[2]; corb_t verb[2];
uint8* buffer; uint8* buffer;
status_t rc; status_t rc;
/* Clear previously allocated memory */ /* Clear previously allocated memory */
if (stream->buffer_area >= B_OK) { if (stream->buffer_area >= B_OK) {
delete_area(stream->buffer_area); delete_area(stream->buffer_area);
@@ -546,10 +546,17 @@ hda_stream_setup_buffers(hda_audio_group* audioGroup, hda_stream* stream,
break; break;
} }
} }
// Stream interrupts seem to arrive too early on most HDA // Stream interrupts seem to arrive too early on most HDA
// so we adjust buffer descriptors to take this into account // so we adjust buffer descriptors to take this into account
uint32 offset = (stream->sample_size * stream->num_channels) * stream->rate / 48000; uint32 offset;
if (format & FORMAT_44_1_BASE_RATE) {
offset = (stream->sample_size * stream->num_channels) * stream->rate
/ 44100;
} else {
offset = (stream->sample_size * stream->num_channels) * stream->rate
/ 48000;
}
if (stream->controller->pci_info.vendor_id != INTEL_VENDORID) if (stream->controller->pci_info.vendor_id != INTEL_VENDORID)
offset *= 32; offset *= 32;
@@ -732,7 +739,7 @@ hda_hw_init(hda_controller* controller)
{ {
uint16 capabilities, stateStatus, cmd; uint16 capabilities, stateStatus, cmd;
status_t status; status_t status;
/* Map MMIO registers */ /* Map MMIO registers */
controller->regs_area = map_physical_memory("hda_hw_regs", controller->regs_area = map_physical_memory("hda_hw_regs",
(void*)controller->pci_info.u.h0.base_registers[0], (void*)controller->pci_info.u.h0.base_registers[0],
@@ -761,20 +768,20 @@ hda_hw_init(hda_controller* controller)
/* TCSEL is reset to TC0 (clear 0-2 bits) */ /* TCSEL is reset to TC0 (clear 0-2 bits) */
update_pci_register(controller, PCI_HDA_TCSEL, PCI_HDA_TCSEL_MASK, 0, 1); update_pci_register(controller, PCI_HDA_TCSEL, PCI_HDA_TCSEL_MASK, 0, 1);
/* Enable snooping for ATI and Nvidia, right now for all their hda-devices, /* Enable snooping for ATI and Nvidia, right now for all their hda-devices,
but only based on guessing. */ but only based on guessing. */
switch (controller->pci_info.vendor_id) { switch (controller->pci_info.vendor_id) {
case NVIDIA_VENDORID: case NVIDIA_VENDORID:
update_pci_register(controller, NVIDIA_HDA_TRANSREG, update_pci_register(controller, NVIDIA_HDA_TRANSREG,
NVIDIA_HDA_TRANSREG_MASK, NVIDIA_HDA_ENABLE_COHBITS, 1); NVIDIA_HDA_TRANSREG_MASK, NVIDIA_HDA_ENABLE_COHBITS, 1);
update_pci_register(controller, NVIDIA_HDA_ISTRM_COH, update_pci_register(controller, NVIDIA_HDA_ISTRM_COH,
~NVIDIA_HDA_ENABLE_COHBIT, NVIDIA_HDA_ENABLE_COHBIT, 1); ~NVIDIA_HDA_ENABLE_COHBIT, NVIDIA_HDA_ENABLE_COHBIT, 1);
update_pci_register(controller, NVIDIA_HDA_OSTRM_COH, update_pci_register(controller, NVIDIA_HDA_OSTRM_COH,
~NVIDIA_HDA_ENABLE_COHBIT, NVIDIA_HDA_ENABLE_COHBIT, 1); ~NVIDIA_HDA_ENABLE_COHBIT, NVIDIA_HDA_ENABLE_COHBIT, 1);
break; break;
case ATI_VENDORID: case ATI_VENDORID:
update_pci_register(controller, ATI_HDA_MISC_CNTR2, update_pci_register(controller, ATI_HDA_MISC_CNTR2,
ATI_HDA_MISC_CNTR2_MASK, ATI_HDA_ENABLE_SNOOP, 1); ATI_HDA_MISC_CNTR2_MASK, ATI_HDA_ENABLE_SNOOP, 1);
break; break;
case INTEL_VENDORID: case INTEL_VENDORID: