mirror of
https://github.com/jpd002/Play-.git
synced 2025-04-28 21:57:57 +03:00
Changes for thread based player.
This commit is contained in:
parent
231ffb8059
commit
82800241aa
6 changed files with 111 additions and 9 deletions
|
@ -12,7 +12,7 @@ let updateTimer : any;
|
||||||
|
|
||||||
let updateFct = async function() {
|
let updateFct = async function() {
|
||||||
let releaseLock = await tickMutex.acquire();
|
let releaseLock = await tickMutex.acquire();
|
||||||
await tickPsf();
|
// await tickPsf();
|
||||||
updateTimer = setTimeout(updateFct, updateDelay);
|
updateTimer = setTimeout(updateFct, updateDelay);
|
||||||
releaseLock();
|
releaseLock();
|
||||||
};
|
};
|
||||||
|
|
|
@ -6,7 +6,8 @@ let module_overrides = {
|
||||||
locateFile: function(path : string) {
|
locateFile: function(path : string) {
|
||||||
const baseURL = window.location.origin + window.location.pathname.substring(0, window.location.pathname.lastIndexOf( "/" ));
|
const baseURL = window.location.origin + window.location.pathname.substring(0, window.location.pathname.lastIndexOf( "/" ));
|
||||||
return baseURL + '/' + path;
|
return baseURL + '/' + path;
|
||||||
}
|
},
|
||||||
|
mainScriptUrlOrBlob: "",
|
||||||
};
|
};
|
||||||
|
|
||||||
function convertStringVectorToArray(strVector : any) {
|
function convertStringVectorToArray(strVector : any) {
|
||||||
|
@ -33,9 +34,10 @@ function convertStringMapToDictionary(strMap : any) {
|
||||||
}
|
}
|
||||||
|
|
||||||
export let initPsfPlayerModule = async function() {
|
export let initPsfPlayerModule = async function() {
|
||||||
|
module_overrides.mainScriptUrlOrBlob = module_overrides.locateFile('PsfPlayer.js');
|
||||||
PsfPlayerModule = await PsfPlayer(module_overrides);
|
PsfPlayerModule = await PsfPlayer(module_overrides);
|
||||||
PsfPlayerModule.FS.mkdir("/work");
|
PsfPlayerModule.FS.mkdir("/work");
|
||||||
await PsfPlayerModule.ccall("initVm", "", [], [], { async: true });
|
PsfPlayerModule.ccall("initVm", "", [], []);
|
||||||
};
|
};
|
||||||
|
|
||||||
export let getPsfArchiveFileList = function(archivePath : string) {
|
export let getPsfArchiveFileList = function(archivePath : string) {
|
||||||
|
|
|
@ -26,6 +26,8 @@ list(APPEND PROJECT_LIBS sh_openal)
|
||||||
|
|
||||||
add_executable(PsfPlayer
|
add_executable(PsfPlayer
|
||||||
Main.cpp
|
Main.cpp
|
||||||
|
SH_AudioProxy.cpp
|
||||||
|
SH_AudioProxy.h
|
||||||
SH_FileOutput.cpp
|
SH_FileOutput.cpp
|
||||||
SH_FileOutput.h
|
SH_FileOutput.h
|
||||||
)
|
)
|
||||||
|
@ -44,6 +46,6 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s ALLOW_TABLE_GROWTH")
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s ALLOW_MEMORY_GROWTH")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s ALLOW_MEMORY_GROWTH")
|
||||||
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s ASSERTIONS=2")
|
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s ASSERTIONS=2")
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lnodefs.js")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lnodefs.js")
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fexceptions")
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread")
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s EXPORT_NAME=PsfPlayer")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s EXPORT_NAME=PsfPlayer")
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s PTHREAD_POOL_SIZE=4")
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s ENVIRONMENT=web,worker")
|
||||||
|
|
|
@ -6,11 +6,13 @@
|
||||||
#include "Jitter_CodeGen_Wasm.h"
|
#include "Jitter_CodeGen_Wasm.h"
|
||||||
#include "BasicBlock.h"
|
#include "BasicBlock.h"
|
||||||
#include "MemoryUtils.h"
|
#include "MemoryUtils.h"
|
||||||
|
#include "SH_AudioProxy.h"
|
||||||
#include "SH_FileOutput.h"
|
#include "SH_FileOutput.h"
|
||||||
#include "../SH_OpenAL.h"
|
#include "../SH_OpenAL.h"
|
||||||
#include <emscripten/bind.h>
|
#include <emscripten/bind.h>
|
||||||
|
|
||||||
CPsfVm* g_virtualMachine = nullptr;
|
CPsfVm* g_virtualMachine = nullptr;
|
||||||
|
CSoundHandler* g_soundHandler = nullptr;
|
||||||
CPsfBase::TagMap g_tags;
|
CPsfBase::TagMap g_tags;
|
||||||
|
|
||||||
int main(int argc, const char** argv)
|
int main(int argc, const char** argv)
|
||||||
|
@ -33,10 +35,11 @@ extern "C" void initVm()
|
||||||
Jitter::CWasmFunctionRegistry::RegisterFunction(reinterpret_cast<uintptr_t>(&MemoryUtils_SetByteProxy), "_MemoryUtils_SetByteProxy", "viii");
|
Jitter::CWasmFunctionRegistry::RegisterFunction(reinterpret_cast<uintptr_t>(&MemoryUtils_SetByteProxy), "_MemoryUtils_SetByteProxy", "viii");
|
||||||
Jitter::CWasmFunctionRegistry::RegisterFunction(reinterpret_cast<uintptr_t>(&MemoryUtils_SetHalfProxy), "_MemoryUtils_SetHalfProxy", "viii");
|
Jitter::CWasmFunctionRegistry::RegisterFunction(reinterpret_cast<uintptr_t>(&MemoryUtils_SetHalfProxy), "_MemoryUtils_SetHalfProxy", "viii");
|
||||||
Jitter::CWasmFunctionRegistry::RegisterFunction(reinterpret_cast<uintptr_t>(&MemoryUtils_SetWordProxy), "_MemoryUtils_SetWordProxy", "viii");
|
Jitter::CWasmFunctionRegistry::RegisterFunction(reinterpret_cast<uintptr_t>(&MemoryUtils_SetWordProxy), "_MemoryUtils_SetWordProxy", "viii");
|
||||||
});
|
}, true);
|
||||||
|
|
||||||
g_virtualMachine->SetSpuHandlerImpl(&CSH_FileOutput::HandlerFactory);
|
//g_soundHandler = new CSH_FileOutput();
|
||||||
//g_virtualMachine->SetSpuHandlerImpl(&CSH_OpenAL::HandlerFactory);
|
g_soundHandler = new CSH_OpenAL();
|
||||||
|
g_virtualMachine->SetSpuHandlerImpl(CSH_AudioProxy::GetFactoryFunction(g_soundHandler));
|
||||||
}
|
}
|
||||||
catch(const std::exception& ex)
|
catch(const std::exception& ex)
|
||||||
{
|
{
|
||||||
|
@ -58,7 +61,7 @@ extern "C" void loadPsf(const char* archivePath, const char* psfPath)
|
||||||
auto fileToken = CArchivePsfStreamProvider::GetPathTokenFromFilePath(psfPath);
|
auto fileToken = CArchivePsfStreamProvider::GetPathTokenFromFilePath(psfPath);
|
||||||
CPsfLoader::LoadPsf(*g_virtualMachine, fileToken, archivePath, &g_tags);
|
CPsfLoader::LoadPsf(*g_virtualMachine, fileToken, archivePath, &g_tags);
|
||||||
g_virtualMachine->Resume();
|
g_virtualMachine->Resume();
|
||||||
});
|
}, true);
|
||||||
}
|
}
|
||||||
catch(const std::exception& ex)
|
catch(const std::exception& ex)
|
||||||
{
|
{
|
||||||
|
|
76
tools/PsfPlayer/Source/js_ui/SH_AudioProxy.cpp
Normal file
76
tools/PsfPlayer/Source/js_ui/SH_AudioProxy.cpp
Normal file
|
@ -0,0 +1,76 @@
|
||||||
|
#include "SH_AudioProxy.h"
|
||||||
|
#include <emscripten/threading.h>
|
||||||
|
#include <cstdio>
|
||||||
|
|
||||||
|
extern "C" void SoundHandlerResetProxy(CSoundHandler* handler)
|
||||||
|
{
|
||||||
|
handler->Reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" void SoundHandlerWriteProxy(CSoundHandler* handler, int16* samples, unsigned int sampleCount, unsigned int sampleRate)
|
||||||
|
{
|
||||||
|
handler->Write(samples, sampleCount, sampleRate);
|
||||||
|
delete [] samples;
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" int SoundHandlerHasFreeBuffersProxy(CSoundHandler* handler)
|
||||||
|
{
|
||||||
|
return handler->HasFreeBuffers();
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" void SoundHandlerRecycleBuffersProxy(CSoundHandler* handler)
|
||||||
|
{
|
||||||
|
handler->RecycleBuffers();
|
||||||
|
}
|
||||||
|
|
||||||
|
CSH_AudioProxy::CSH_AudioProxy(CSoundHandler* parent)
|
||||||
|
: m_parent(parent)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
CSoundHandler::FactoryFunction CSH_AudioProxy::GetFactoryFunction(CSoundHandler* soundHandler)
|
||||||
|
{
|
||||||
|
return [soundHandler]() { return new CSH_AudioProxy(soundHandler); };
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSH_AudioProxy::Reset()
|
||||||
|
{
|
||||||
|
emscripten_async_run_in_main_runtime_thread(
|
||||||
|
EM_FUNC_SIG_RETURN_VALUE_V |
|
||||||
|
EM_FUNC_SIG_WITH_N_PARAMETERS(1) |
|
||||||
|
EM_FUNC_SIG_SET_PARAM(0, EM_FUNC_SIG_PARAM_I),
|
||||||
|
&SoundHandlerResetProxy, m_parent);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSH_AudioProxy::Write(int16* samples, unsigned int sampleCount, unsigned int sampleRate)
|
||||||
|
{
|
||||||
|
int16* proxySamples = new int16[sampleCount];
|
||||||
|
memcpy(proxySamples, samples, sizeof(int16) * sampleCount);
|
||||||
|
emscripten_async_run_in_main_runtime_thread(
|
||||||
|
EM_FUNC_SIG_RETURN_VALUE_V |
|
||||||
|
EM_FUNC_SIG_WITH_N_PARAMETERS(4) |
|
||||||
|
EM_FUNC_SIG_SET_PARAM(0, EM_FUNC_SIG_PARAM_I) | EM_FUNC_SIG_SET_PARAM(1, EM_FUNC_SIG_PARAM_I) |
|
||||||
|
EM_FUNC_SIG_SET_PARAM(2, EM_FUNC_SIG_PARAM_I) | EM_FUNC_SIG_SET_PARAM(3, EM_FUNC_SIG_PARAM_I),
|
||||||
|
&SoundHandlerWriteProxy, m_parent, proxySamples, sampleCount, sampleRate);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CSH_AudioProxy::HasFreeBuffers()
|
||||||
|
{
|
||||||
|
// int result = emscripten_sync_run_in_main_runtime_thread(
|
||||||
|
// EM_FUNC_SIG_RETURN_VALUE_I |
|
||||||
|
// EM_FUNC_SIG_WITH_N_PARAMETERS(1) |
|
||||||
|
// EM_FUNC_SIG_SET_PARAM(0, EM_FUNC_SIG_PARAM_I),
|
||||||
|
// &SoundHandlerHasFreeBuffersProxy, m_parent);
|
||||||
|
// return result;
|
||||||
|
return m_parent->HasFreeBuffers();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSH_AudioProxy::RecycleBuffers()
|
||||||
|
{
|
||||||
|
emscripten_async_run_in_main_runtime_thread(
|
||||||
|
EM_FUNC_SIG_RETURN_VALUE_V |
|
||||||
|
EM_FUNC_SIG_WITH_N_PARAMETERS(1) |
|
||||||
|
EM_FUNC_SIG_SET_PARAM(0, EM_FUNC_SIG_PARAM_I),
|
||||||
|
&SoundHandlerRecycleBuffersProxy, m_parent);
|
||||||
|
}
|
19
tools/PsfPlayer/Source/js_ui/SH_AudioProxy.h
Normal file
19
tools/PsfPlayer/Source/js_ui/SH_AudioProxy.h
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "../SoundHandler.h"
|
||||||
|
|
||||||
|
class CSH_AudioProxy : public CSoundHandler
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CSH_AudioProxy(CSoundHandler*);
|
||||||
|
|
||||||
|
static FactoryFunction GetFactoryFunction(CSoundHandler*);
|
||||||
|
|
||||||
|
void Reset() override;
|
||||||
|
void Write(int16*, unsigned int, unsigned int) override;
|
||||||
|
bool HasFreeBuffers() override;
|
||||||
|
void RecycleBuffers() override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
CSoundHandler* m_parent = nullptr;
|
||||||
|
};
|
Loading…
Add table
Add a link
Reference in a new issue