2016-06-05 01:33:35 +00:00
|
|
|
/****************************************************************************
|
2017-09-11 11:57:21 +00:00
|
|
|
* *
|
|
|
|
* Project64-audio - A Nintendo 64 audio plugin. *
|
|
|
|
* http://www.pj64-emu.com/ *
|
|
|
|
* Copyright (C) 2017 Project64. All rights reserved. *
|
|
|
|
* Copyright (C) 2015 Gilles Siberlin *
|
|
|
|
* Copyright (C) 2007-2009 Richard Goedeken *
|
|
|
|
* Copyright (C) 2007-2008 Ebenblues *
|
|
|
|
* Copyright (C) 2003 JttL *
|
|
|
|
* Copyright (C) 2002 Hacktarux *
|
|
|
|
* *
|
|
|
|
* License: *
|
|
|
|
* GNU/GPLv2 http://www.gnu.org/licenses/gpl-2.0.html *
|
|
|
|
* *
|
|
|
|
****************************************************************************/
|
2017-09-20 07:24:54 +00:00
|
|
|
#include <Common/Util.h>
|
2017-09-21 13:20:36 +00:00
|
|
|
#ifdef _WIN32
|
|
|
|
#include <Project64-audio/Driver/DirectSound.h>
|
|
|
|
#else
|
2017-09-12 07:58:35 +00:00
|
|
|
#include <Project64-audio/Driver/OpenSLES.h>
|
2017-09-21 13:20:36 +00:00
|
|
|
#endif
|
2016-06-05 01:33:35 +00:00
|
|
|
#include "audio_1.1.h"
|
|
|
|
#include "Version.h"
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include "AudioSettings.h"
|
|
|
|
#include "trace.h"
|
2017-09-11 12:20:34 +00:00
|
|
|
#include "AudioMain.h"
|
2017-09-25 12:00:04 +00:00
|
|
|
#include "ConfigUI.h"
|
2017-09-11 22:37:32 +00:00
|
|
|
#include "SettingsID.h"
|
2016-06-05 01:33:35 +00:00
|
|
|
|
|
|
|
/* Read header for type definition */
|
|
|
|
AUDIO_INFO g_AudioInfo;
|
|
|
|
|
|
|
|
bool g_PluginInit = false;
|
2017-09-26 13:57:33 +00:00
|
|
|
bool g_romopen = false;
|
2017-09-13 07:41:52 +00:00
|
|
|
uint32_t g_Dacrate = 0;
|
2016-06-05 01:33:35 +00:00
|
|
|
|
2017-09-21 13:20:36 +00:00
|
|
|
#ifdef _WIN32
|
|
|
|
DirectSoundDriver * g_SoundDriver = NULL;
|
|
|
|
#else
|
2017-09-12 07:58:35 +00:00
|
|
|
OpenSLESDriver * g_SoundDriver = NULL;
|
2017-09-21 13:20:36 +00:00
|
|
|
#endif
|
2017-09-12 07:58:35 +00:00
|
|
|
|
2016-08-11 10:46:03 +00:00
|
|
|
void PluginInit(void)
|
2016-06-05 01:33:35 +00:00
|
|
|
{
|
|
|
|
if (g_PluginInit)
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
SetupTrace();
|
|
|
|
SetupAudioSettings();
|
2017-09-11 22:16:45 +00:00
|
|
|
StartTrace();
|
2016-06-05 01:33:35 +00:00
|
|
|
g_PluginInit = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
EXPORT void CALL PluginLoaded(void)
|
|
|
|
{
|
|
|
|
PluginInit();
|
|
|
|
WriteTrace(TraceAudioInterface, TraceDebug, "Called");
|
|
|
|
}
|
|
|
|
|
|
|
|
EXPORT void CALL AiDacrateChanged(int SystemType)
|
|
|
|
{
|
2016-08-11 10:46:03 +00:00
|
|
|
WriteTrace(TraceAudioInterface, TraceDebug, "Start (SystemType: %d)", SystemType);
|
2016-06-05 01:33:35 +00:00
|
|
|
if (!g_PluginInit)
|
|
|
|
{
|
|
|
|
WriteTrace(TraceAudioInterface, TraceNotice, "Plugin has not been initilized");
|
|
|
|
WriteTrace(TraceAudioInterface, TraceDebug, "Done");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2017-09-13 07:41:52 +00:00
|
|
|
if (g_SoundDriver && g_Dacrate != *g_AudioInfo.AI_DACRATE_REG)
|
2016-06-05 01:33:35 +00:00
|
|
|
{
|
2017-09-13 07:41:52 +00:00
|
|
|
g_Dacrate = *g_AudioInfo.AI_DACRATE_REG & 0x00003FFF;
|
|
|
|
if (g_Dacrate != *g_AudioInfo.AI_DACRATE_REG)
|
|
|
|
{
|
|
|
|
WriteTrace(TraceAudioInterface, TraceNotice, "Unknown/reserved bits in AI_DACRATE_REG set. 0x%08X", *g_AudioInfo.AI_DACRATE_REG);
|
|
|
|
}
|
2016-08-11 10:46:03 +00:00
|
|
|
|
2017-09-13 07:41:52 +00:00
|
|
|
uint32_t video_clock = 0;
|
|
|
|
switch (SystemType)
|
|
|
|
{
|
|
|
|
case SYSTEM_NTSC: video_clock = 48681812; break;
|
|
|
|
case SYSTEM_PAL: video_clock = 49656530; break;
|
|
|
|
case SYSTEM_MPAL: video_clock = 48628316; break;
|
|
|
|
}
|
|
|
|
uint32_t Frequency = video_clock / (g_Dacrate + 1);
|
2017-09-28 19:32:43 +00:00
|
|
|
|
2017-10-15 16:43:32 +00:00
|
|
|
if (Frequency < 4000)
|
|
|
|
{
|
|
|
|
WriteTrace(TraceAudioDriver, TraceDebug, "Not Audio Data!");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
int32_t BufferSize = 0; double audio_clock = 0;
|
|
|
|
double framerate1 = 59.94004; double framerate2 = 64; double framerate = 0;
|
2017-10-13 00:29:45 +00:00
|
|
|
|
2017-10-15 16:43:32 +00:00
|
|
|
if (g_settings->FPSBuffer() == true)
|
2017-10-13 00:29:45 +00:00
|
|
|
{
|
|
|
|
framerate = framerate1;
|
|
|
|
}
|
2017-10-15 16:43:32 +00:00
|
|
|
else
|
2017-10-13 00:29:45 +00:00
|
|
|
{
|
|
|
|
framerate = framerate2;
|
|
|
|
}
|
2017-10-15 16:43:32 +00:00
|
|
|
if (g_settings->TinyBuffer() == true)
|
|
|
|
{
|
|
|
|
audio_clock = ((video_clock / framerate) * 2);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
audio_clock = ((video_clock / framerate) * 4);
|
|
|
|
}
|
2017-10-13 00:29:45 +00:00
|
|
|
|
2017-10-15 16:43:32 +00:00
|
|
|
BufferSize = (int32_t)audio_clock / (g_Dacrate) + 1 & ~0x1;
|
|
|
|
g_SoundDriver->AI_SetFrequency(Frequency, BufferSize);
|
|
|
|
}
|
2017-09-13 07:41:52 +00:00
|
|
|
}
|
2016-06-05 01:33:35 +00:00
|
|
|
WriteTrace(TraceAudioInterface, TraceDebug, "Done");
|
|
|
|
}
|
|
|
|
|
|
|
|
EXPORT void CALL AiLenChanged(void)
|
|
|
|
{
|
2017-09-13 07:41:52 +00:00
|
|
|
WriteTrace(TraceAudioInterface, TraceDebug, "Start (DRAM_ADDR = 0x%X Len = 0x%X)", *g_AudioInfo.AI_DRAM_ADDR_REG, *g_AudioInfo.AI_LEN_REG);
|
2017-09-25 12:00:04 +00:00
|
|
|
if (g_SoundDriver && g_settings->AudioEnabled())
|
2016-08-11 10:46:03 +00:00
|
|
|
{
|
2017-09-13 07:41:52 +00:00
|
|
|
uint32_t Len = *g_AudioInfo.AI_LEN_REG & 0x3FFF8;
|
|
|
|
uint8_t * Buffer = (g_AudioInfo.RDRAM + (*g_AudioInfo.AI_DRAM_ADDR_REG & 0x00FFFFF8));
|
2016-06-05 01:33:35 +00:00
|
|
|
|
2017-09-13 07:41:52 +00:00
|
|
|
g_SoundDriver->AI_LenChanged(Buffer, Len);
|
2016-06-05 01:33:35 +00:00
|
|
|
}
|
|
|
|
WriteTrace(TraceAudioInterface, TraceDebug, "Done");
|
|
|
|
}
|
|
|
|
|
|
|
|
EXPORT uint32_t CALL AiReadLength(void)
|
|
|
|
{
|
2017-09-22 21:45:18 +00:00
|
|
|
WriteTrace(TraceAudioInterface, TraceDebug, "Start");
|
|
|
|
uint32_t len = 0;
|
|
|
|
if (g_SoundDriver != NULL)
|
|
|
|
{
|
|
|
|
*g_AudioInfo.AI_LEN_REG = g_SoundDriver->AI_ReadLength();
|
|
|
|
len = *g_AudioInfo.AI_LEN_REG;
|
|
|
|
}
|
|
|
|
WriteTrace(TraceAudioInterface, TraceDebug, "Done (len: 0x%X)", len);
|
|
|
|
return len;
|
2016-06-05 01:33:35 +00:00
|
|
|
}
|
|
|
|
|
2017-09-20 07:24:54 +00:00
|
|
|
EXPORT void CALL AiUpdate(int32_t Wait)
|
2016-06-05 01:33:35 +00:00
|
|
|
{
|
2017-09-20 07:24:54 +00:00
|
|
|
WriteTrace(TraceAudioInterface, TraceDebug, "Start (Wait: %s)", Wait ? "true" : "false");
|
|
|
|
if (g_SoundDriver)
|
|
|
|
{
|
|
|
|
g_SoundDriver->AI_Update(Wait != 0);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2017-10-13 03:28:20 +00:00
|
|
|
pjutil::Sleep(1); // TODO: Fixme -- Ai Update appears to be problematic
|
2017-09-20 07:24:54 +00:00
|
|
|
}
|
|
|
|
WriteTrace(TraceAudioInterface, TraceDebug, "Done");
|
2016-06-05 01:33:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
EXPORT void CALL CloseDLL(void)
|
|
|
|
{
|
|
|
|
WriteTrace(TraceAudioInterface, TraceDebug, "Called");
|
2017-09-14 08:07:12 +00:00
|
|
|
CleanupAudioSettings();
|
2016-06-05 01:33:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
EXPORT void CALL DllAbout(void * /*hParent*/)
|
|
|
|
{
|
|
|
|
WriteTrace(TraceAudioInterface, TraceDebug, "Called");
|
|
|
|
}
|
|
|
|
|
2017-09-25 12:00:04 +00:00
|
|
|
EXPORT void CALL DllConfig(void * hParent)
|
2016-06-05 01:33:35 +00:00
|
|
|
{
|
2017-09-25 12:00:04 +00:00
|
|
|
#ifdef _WIN32
|
|
|
|
ConfigAudio(hParent);
|
|
|
|
if (g_SoundDriver)
|
|
|
|
{
|
|
|
|
g_SoundDriver->SetVolume(g_settings->GetVolume());
|
|
|
|
}
|
|
|
|
#endif
|
2016-06-05 01:33:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
EXPORT void CALL DllTest(void * /*hParent*/)
|
|
|
|
{
|
|
|
|
WriteTrace(TraceAudioInterface, TraceDebug, "Called");
|
|
|
|
}
|
|
|
|
|
|
|
|
EXPORT void CALL GetDllInfo(PLUGIN_INFO * PluginInfo)
|
|
|
|
{
|
|
|
|
PluginInfo->Version = 0x0101;
|
|
|
|
PluginInfo->Type = PLUGIN_TYPE_AUDIO;
|
|
|
|
#ifdef _DEBUG
|
2017-09-11 22:16:45 +00:00
|
|
|
sprintf(PluginInfo->Name, "Project64 Audio Plugin (Debug): %s", VER_FILE_VERSION_STR);
|
2016-06-05 01:33:35 +00:00
|
|
|
#else
|
2017-09-11 22:16:45 +00:00
|
|
|
sprintf(PluginInfo->Name, "Project64 Audio Plugin: %s", VER_FILE_VERSION_STR);
|
2016-06-05 01:33:35 +00:00
|
|
|
#endif
|
|
|
|
PluginInfo->MemoryBswaped = true;
|
|
|
|
PluginInfo->NormalMemory = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
EXPORT int32_t CALL InitiateAudio(AUDIO_INFO Audio_Info)
|
|
|
|
{
|
|
|
|
WriteTrace(TraceAudioInterface, TraceDebug, "Start");
|
2017-09-12 07:58:35 +00:00
|
|
|
if (g_SoundDriver != NULL)
|
|
|
|
{
|
2017-09-20 07:24:54 +00:00
|
|
|
g_SoundDriver->AI_Shutdown();
|
2017-09-12 07:58:35 +00:00
|
|
|
delete g_SoundDriver;
|
|
|
|
}
|
2016-06-05 01:33:35 +00:00
|
|
|
g_AudioInfo = Audio_Info;
|
2017-09-21 13:20:36 +00:00
|
|
|
#ifdef _WIN32
|
|
|
|
g_SoundDriver = new DirectSoundDriver;
|
|
|
|
#else
|
2017-09-12 07:58:35 +00:00
|
|
|
g_SoundDriver = new OpenSLESDriver;
|
|
|
|
#endif
|
2016-06-05 01:33:35 +00:00
|
|
|
WriteTrace(TraceAudioInterface, TraceDebug, "Done (res: true)");
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
EXPORT void CALL RomOpen()
|
|
|
|
{
|
|
|
|
WriteTrace(TraceAudioInterface, TraceDebug, "Start");
|
2017-09-26 13:57:33 +00:00
|
|
|
g_romopen = true;
|
|
|
|
g_settings->ReadSettings();
|
2017-09-13 07:41:52 +00:00
|
|
|
if (g_SoundDriver)
|
|
|
|
{
|
2017-09-14 08:07:12 +00:00
|
|
|
g_SoundDriver->AI_Startup();
|
2017-09-13 07:41:52 +00:00
|
|
|
}
|
2016-06-05 01:33:35 +00:00
|
|
|
WriteTrace(TraceAudioInterface, TraceDebug, "Done");
|
|
|
|
}
|
|
|
|
|
|
|
|
EXPORT void CALL RomClosed(void)
|
|
|
|
{
|
|
|
|
WriteTrace(TraceAudioInterface, TraceDebug, "Start");
|
2017-09-13 07:41:52 +00:00
|
|
|
g_Dacrate = 0;
|
|
|
|
if (g_SoundDriver)
|
|
|
|
{
|
|
|
|
g_SoundDriver->AI_Shutdown();
|
|
|
|
}
|
2017-09-26 13:57:33 +00:00
|
|
|
g_romopen = false;
|
2016-06-05 01:33:35 +00:00
|
|
|
WriteTrace(TraceAudioInterface, TraceDebug, "Done");
|
|
|
|
}
|
|
|
|
|
|
|
|
EXPORT void CALL ProcessAList(void)
|
|
|
|
{
|
|
|
|
WriteTrace(TraceAudioInterface, TraceDebug, "Called");
|
|
|
|
}
|
|
|
|
|
|
|
|
extern "C" void UseUnregisteredSetting(int /*SettingID*/)
|
|
|
|
{
|
|
|
|
WriteTrace(TraceAudioInterface, TraceDebug, "Called");
|
|
|
|
#ifdef _WIN32
|
|
|
|
DebugBreak();
|
|
|
|
#endif
|
2017-10-13 00:29:45 +00:00
|
|
|
}
|