/* * QEMU MCPX Audio Processing Unit implementation * * Copyright (c) 2012 espes * Copyright (c) 2018-2019 Jannik Vogel * Copyright (c) 2019-2025 Matt Borgerson * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, see . */ #ifndef HW_XBOX_MCPX_APU_INT_H #define HW_XBOX_MCPX_APU_INT_H #include "qemu/osdep.h" #include #include #include "hw/hw.h" #include "hw/pci/pci.h" #include "hw/pci/pci_device.h" #include "cpu.h" #include "migration/vmstate.h" #include "qemu/main-loop.h" #include "qemu/thread.h" #include "sysemu/runstate.h" #include "audio/audio.h" #include "qemu/fifo8.h" #include "ui/xemu-settings.h" #include "trace.h" #include "apu.h" #include "apu_regs.h" #include "apu_debug.h" #include "fpconv.h" #include "vp/vp.h" #include "dsp/gp_ep.h" #define GET_MASK(v, mask) (((v) & (mask)) >> ctz32(mask)) #define SET_MASK(v, mask, val) \ do { \ (v) &= ~(mask); \ (v) |= ((val) << ctz32(mask)) & (mask); \ } while (0) #define CASE_4(v, step) \ case (v): \ case (v)+(step): \ case (v)+(step)*2: \ case (v)+(step)*3 // #define DEBUG_MCPX #ifdef DEBUG_MCPX #define DPRINTF(fmt, ...) \ do { fprintf(stderr, fmt, ## __VA_ARGS__); } while (0) #else #define DPRINTF(fmt, ...) \ do { } while (0) #endif #define MCPX_APU_DEVICE(obj) \ OBJECT_CHECK(MCPXAPUState, (obj), "mcpx-apu") typedef struct MCPXAPUState { /*< private >*/ PCIDevice parent_obj; /*< public >*/ bool exiting; bool set_irq; QemuThread apu_thread; QemuMutex lock; QemuCond cond; MemoryRegion *ram; uint8_t *ram_ptr; MemoryRegion mmio; MCPXAPUVPState vp; MCPXAPUGPState gp; MCPXAPUEPState ep; uint32_t regs[0x20000]; int ep_frame_div; int sleep_acc; int frame_count; int64_t frame_count_time; struct { McpxApuDebugMonitorPoint point; int16_t frame_buf[256][2]; // 1 EP frame (0x400 bytes), 8 buffered QemuSpin fifo_lock; Fifo8 fifo; } monitor; } MCPXAPUState; extern MCPXAPUState *g_state; // Used via debug handlers extern struct McpxApuDebug g_dbg, g_dbg_cache; extern int g_dbg_voice_monitor; extern uint64_t g_dbg_muted_voices[4]; void mcpx_debug_begin_frame(void); void mcpx_debug_end_frame(void); #endif