cellAudio: use vm::gvar to allocate working memory

This commit is contained in:
Nekotekina 2019-09-15 02:04:31 +03:00
parent 584174d371
commit 76314520ef
2 changed files with 22 additions and 24 deletions

View file

@ -10,6 +10,10 @@
LOG_CHANNEL(cellAudio); LOG_CHANNEL(cellAudio);
vm::gvar<char, AUDIO_PORT_OFFSET * AUDIO_PORT_COUNT> g_audio_buffer;
vm::gvar<u64, AUDIO_PORT_COUNT> g_audio_indices;
template <> template <>
void fmt_class_string<CellAudioError>::format(std::string& out, u64 arg) void fmt_class_string<CellAudioError>::format(std::string& out, u64 arg)
{ {
@ -433,7 +437,7 @@ void cell_audio_thread::advance(u64 timestamp, bool reset)
port.timestamp = timestamp; port.timestamp = timestamp;
port.cur_pos = port.position(1); port.cur_pos = port.position(1);
m_indexes[port.number] = port.cur_pos; g_audio_indices[port.number] = port.cur_pos;
} }
if (cfg.buffering_enabled) if (cfg.buffering_enabled)
@ -931,20 +935,26 @@ error_code cellAudioInit()
{ {
cellAudio.warning("cellAudioInit()"); cellAudio.warning("cellAudioInit()");
const auto buf = vm::cast(vm::alloc(AUDIO_PORT_OFFSET * AUDIO_PORT_COUNT, vm::main));
const auto ind = vm::cast(vm::alloc(sizeof(u64) * AUDIO_PORT_COUNT, vm::main));
// Start audio thread // Start audio thread
auto g_audio = g_idm->lock<named_thread<cell_audio_thread>>(id_new); auto g_audio = g_idm->lock<named_thread<cell_audio_thread>>(id_new);
if (!g_audio) if (!g_audio)
{ {
vm::dealloc(buf);
vm::dealloc(ind);
return CELL_AUDIO_ERROR_ALREADY_INIT; return CELL_AUDIO_ERROR_ALREADY_INIT;
} }
g_audio.create("cellAudio Thread", buf, ind); std::memset(g_audio_buffer.get_ptr(), 0, g_audio_buffer.alloc_size);
std::memset(g_audio_indices.get_ptr(), 0, g_audio_indices.alloc_size);
g_audio.create("cellAudio Thread");
for (u32 i = 0; i < AUDIO_PORT_COUNT; i++)
{
g_audio->ports[i].number = i;
g_audio->ports[i].addr = g_audio_buffer + AUDIO_PORT_OFFSET * i;
g_audio->ports[i].index = g_audio_indices + i;
}
return CELL_OK; return CELL_OK;
} }
@ -977,12 +987,7 @@ error_code cellAudioQuit(ppu_thread& ppu)
if (*g_audio.get() == thread_state::finished) if (*g_audio.get() == thread_state::finished)
{ {
const auto buf = g_audio->ports[0].addr;
const auto ind = g_audio->ports[0].index;
g_audio.destroy(); g_audio.destroy();
g_audio.unlock();
vm::dealloc(buf.addr());
vm::dealloc(ind.addr());
break; break;
} }
} }
@ -1610,6 +1615,10 @@ error_code cellAudioUnsetPersonalDevice(s32 iPersonalStream)
DECLARE(ppu_module_manager::cellAudio)("cellAudio", []() DECLARE(ppu_module_manager::cellAudio)("cellAudio", []()
{ {
// Private variables
REG_VAR(cellAudio, g_audio_buffer).flag(MFF_HIDDEN);
REG_VAR(cellAudio, g_audio_indices).flag(MFF_HIDDEN);
REG_FUNC(cellAudio, cellAudioInit); REG_FUNC(cellAudio, cellAudioInit);
REG_FUNC(cellAudio, cellAudioPortClose); REG_FUNC(cellAudio, cellAudioPortClose);
REG_FUNC(cellAudio, cellAudioPortStop); REG_FUNC(cellAudio, cellAudioPortStop);

View file

@ -321,9 +321,6 @@ public:
class cell_audio_thread class cell_audio_thread
{ {
vm::ptr<char> m_buffer;
vm::ptr<u64> m_indexes;
std::unique_ptr<audio_ringbuffer> ringbuffer; std::unique_ptr<audio_ringbuffer> ringbuffer;
void reset_ports(s32 offset = 0); void reset_ports(s32 offset = 0);
@ -352,16 +349,8 @@ public:
void operator()(); void operator()();
cell_audio_thread(vm::ptr<char> buf, vm::ptr<u64> ind) cell_audio_thread()
: m_buffer(buf)
, m_indexes(ind)
{ {
for (u32 i = 0; i < AUDIO_PORT_COUNT; i++)
{
ports[i].number = i;
ports[i].addr = m_buffer + AUDIO_PORT_OFFSET * i;
ports[i].index = m_indexes + i;
}
} }
audio_port* open_port() audio_port* open_port()