Removed XMAContextData::kSize constant, moved kXmaContextCount, changes to use newer ringbuffer, cleaned up XMAInitializeContext a bit (with fixes for loop_data handling).
This commit is contained in:
@@ -56,11 +56,6 @@ namespace apu {
|
||||
|
||||
using namespace xe::cpu;
|
||||
|
||||
// Size of a hardware XMA context.
|
||||
const uint32_t kXmaContextSize = 64;
|
||||
// Total number of XMA contexts available.
|
||||
const uint32_t kXmaContextCount = 320;
|
||||
|
||||
AudioSystem::AudioSystem(Emulator* emulator)
|
||||
: emulator_(emulator),
|
||||
memory_(emulator->memory()),
|
||||
@@ -99,10 +94,10 @@ X_STATUS AudioSystem::Setup() {
|
||||
|
||||
// Setup XMA contexts ptr.
|
||||
registers_.xma_context_array_ptr = memory()->SystemHeapAlloc(
|
||||
kXmaContextSize * kXmaContextCount, 256, kSystemHeapPhysical);
|
||||
sizeof(XMAContextData) * kXmaContextCount, 256, kSystemHeapPhysical);
|
||||
// Add all contexts to the free list.
|
||||
for (int i = kXmaContextCount - 1; i >= 0; --i) {
|
||||
uint32_t ptr = registers_.xma_context_array_ptr + i * kXmaContextSize;
|
||||
uint32_t ptr = registers_.xma_context_array_ptr + i * sizeof(XMAContextData);
|
||||
|
||||
XMAContext& context = xma_context_array_[i];
|
||||
|
||||
@@ -268,7 +263,7 @@ void AudioSystem::ReleaseXmaContext(uint32_t guest_ptr) {
|
||||
|
||||
context.in_use = false;
|
||||
auto context_ptr = memory()->TranslateVirtual(guest_ptr);
|
||||
std::memset(context_ptr, 0, kXmaContextSize); // Zero it.
|
||||
std::memset(context_ptr, 0, sizeof(XMAContextData)); // Zero it.
|
||||
context.decoder->DiscardPacket();
|
||||
|
||||
context.lock.unlock();
|
||||
@@ -380,9 +375,8 @@ void AudioSystem::ProcessXmaContext(XMAContext& context, XMAContextData& data) {
|
||||
uint32_t output_write_offset_bytes = data.output_buffer_write_offset * 256;
|
||||
uint32_t output_read_offset_bytes = data.output_buffer_read_offset * 256;
|
||||
|
||||
RingBuffer output_buffer(out, output_size_bytes, output_write_offset_bytes);
|
||||
size_t output_remaining_bytes
|
||||
= output_buffer.DistanceToOffset(output_read_offset_bytes);
|
||||
RingBuffer output_buffer(out, output_size_bytes, output_read_offset_bytes, output_write_offset_bytes);
|
||||
size_t output_remaining_bytes = output_buffer.write_size();
|
||||
|
||||
if (!output_remaining_bytes) {
|
||||
// Can't write any more data. Break.
|
||||
@@ -618,8 +612,8 @@ void AudioSystem::WriteRegister(uint32_t addr, uint64_t value) {
|
||||
XMAContext& context = xma_context_array_[context_id];
|
||||
XELOGAPU("AudioSystem: reset context %d", context_id);
|
||||
|
||||
uint32_t guest_ptr =
|
||||
registers_.xma_context_array_ptr + context_id * kXmaContextSize;
|
||||
uint32_t guest_ptr = registers_.xma_context_array_ptr +
|
||||
context_id * sizeof(XMAContextData);
|
||||
context.lock.lock();
|
||||
auto context_ptr = memory()->TranslateVirtual(context.guest_ptr);
|
||||
XMAContextData data(context_ptr);
|
||||
|
||||
@@ -38,7 +38,6 @@ class AudioDecoder;
|
||||
|
||||
// http://pastebin.com/9amqJ2kQ
|
||||
struct XMAContextData {
|
||||
static const uint32_t kSize = 64;
|
||||
static const uint32_t kBytesPerPacket = 2048;
|
||||
static const uint32_t kSamplesPerFrame = 512;
|
||||
static const uint32_t kSamplesPerSubframe = 128;
|
||||
@@ -100,6 +99,9 @@ struct XMAContextData {
|
||||
uint32_t output_buffer_read_offset : 5;
|
||||
uint32_t unk_dword_9 : 27; // StopWhenDone/InterruptWhenDone(?)
|
||||
|
||||
// DWORD 10-15
|
||||
uint32_t unk_dwords_10_15[6]; // reserved?
|
||||
|
||||
XMAContextData(const void* ptr) {
|
||||
xe::copy_and_swap_32_aligned(reinterpret_cast<uint32_t*>(this),
|
||||
reinterpret_cast<const uint32_t*>(ptr),
|
||||
@@ -112,7 +114,7 @@ struct XMAContextData {
|
||||
sizeof(XMAContextData) / 4);
|
||||
}
|
||||
};
|
||||
static_assert(sizeof(XMAContextData) == 4 * 10, "Must be packed");
|
||||
static_assert_size(XMAContextData, 64);
|
||||
|
||||
class AudioSystem {
|
||||
protected:
|
||||
@@ -211,7 +213,8 @@ class AudioSystem {
|
||||
AudioDecoder* decoder;
|
||||
};
|
||||
|
||||
XMAContext xma_context_array_[320];
|
||||
static const uint32_t kXmaContextCount = 320; // // Total number of XMA contexts available.
|
||||
XMAContext xma_context_array_[kXmaContextCount];
|
||||
std::vector<uint32_t> xma_context_free_list_;
|
||||
std::vector<uint32_t> xma_context_used_list_; // XMA contexts in use
|
||||
|
||||
|
||||
Reference in New Issue
Block a user