mirror of
https://github.com/mauiaaron/apple2.git
synced 2025-01-16 16:30:48 +00:00
Refactor : coalesce two structs into one for clarity
This commit is contained in:
parent
ba42037473
commit
a2663298d1
@ -246,15 +246,11 @@ static short g_nMixBuffer[g_dwDSBufferSize / sizeof(short)];
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
static VOICE MockingboardVoice = {0};
|
static AudioBuffer_s *MockingboardVoice = NULL;
|
||||||
|
|
||||||
// HACK FIXME TODO : why 64? do we really need this much?!
|
// HACK FIXME TODO : why 64? do we really need this much?!
|
||||||
#define MAX_VOICES 64
|
#define MAX_VOICES 64
|
||||||
#ifdef APPLE2IX
|
static AudioBuffer_s *SSI263Voice[MAX_VOICES] = { 0 };
|
||||||
static VOICE SSI263Voice[MAX_VOICES];
|
|
||||||
#else
|
|
||||||
static VOICE SSI263Voice[MAX_VOICES] = {0};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef APPLE2IX
|
#ifdef APPLE2IX
|
||||||
static pthread_cond_t mockingboard_cond = PTHREAD_COND_INITIALIZER;
|
static pthread_cond_t mockingboard_cond = PTHREAD_COND_INITIALIZER;
|
||||||
@ -898,14 +894,14 @@ static void MB_Update()
|
|||||||
{
|
{
|
||||||
#ifdef APPLE2IX
|
#ifdef APPLE2IX
|
||||||
static int nNumSamplesError = 0;
|
static int nNumSamplesError = 0;
|
||||||
if (!MockingboardVoice.bActive || !g_bMB_Active)
|
if (!MockingboardVoice->bActive || !g_bMB_Active)
|
||||||
{
|
{
|
||||||
nNumSamplesError = 0;
|
nNumSamplesError = 0;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
char szDbg[200];
|
char szDbg[200];
|
||||||
if (!MockingboardVoice.bActive)
|
if (!MockingboardVoice->bActive)
|
||||||
return;
|
return;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -978,9 +974,9 @@ static void MB_Update()
|
|||||||
|
|
||||||
unsigned long dwCurrentPlayCursor, dwCurrentWriteCursor;
|
unsigned long dwCurrentPlayCursor, dwCurrentWriteCursor;
|
||||||
#ifdef APPLE2IX
|
#ifdef APPLE2IX
|
||||||
int hr = MockingboardVoice.lpDSBvoice->GetCurrentPosition(MockingboardVoice.lpDSBvoice->_this, &dwCurrentPlayCursor, &dwCurrentWriteCursor);
|
int hr = MockingboardVoice->GetCurrentPosition(MockingboardVoice->_this, &dwCurrentPlayCursor, &dwCurrentWriteCursor);
|
||||||
#else
|
#else
|
||||||
int hr = MockingboardVoice.lpDSBvoice->GetCurrentPosition(&dwCurrentPlayCursor, &dwCurrentWriteCursor);
|
int hr = MockingboardVoice->GetCurrentPosition(&dwCurrentPlayCursor, &dwCurrentWriteCursor);
|
||||||
#endif
|
#endif
|
||||||
if(FAILED(hr))
|
if(FAILED(hr))
|
||||||
return;
|
return;
|
||||||
@ -1096,10 +1092,10 @@ static void MB_Update()
|
|||||||
//
|
//
|
||||||
|
|
||||||
#ifdef APPLE2IX
|
#ifdef APPLE2IX
|
||||||
if(!DSGetLock(MockingboardVoice.lpDSBvoice,
|
if(!DSGetLock(MockingboardVoice,
|
||||||
/*unused*/0, (unsigned long)nNumSamples*sizeof(short)*g_nMB_NumChannels,
|
/*unused*/0, (unsigned long)nNumSamples*sizeof(short)*g_nMB_NumChannels,
|
||||||
#else
|
#else
|
||||||
if(DSGetLock(MockingboardVoice.lpDSBvoice,
|
if(DSGetLock(MockingboardVoice,
|
||||||
dwByteOffset, (unsigned long)nNumSamples*sizeof(short)*g_nMB_NumChannels,
|
dwByteOffset, (unsigned long)nNumSamples*sizeof(short)*g_nMB_NumChannels,
|
||||||
#endif
|
#endif
|
||||||
&pDSLockedBuffer0, &dwDSLockedBufferSize0,
|
&pDSLockedBuffer0, &dwDSLockedBufferSize0,
|
||||||
@ -1116,9 +1112,9 @@ static void MB_Update()
|
|||||||
|
|
||||||
// Commit sound buffer
|
// Commit sound buffer
|
||||||
#ifdef APPLE2IX
|
#ifdef APPLE2IX
|
||||||
MockingboardVoice.lpDSBvoice->Unlock(MockingboardVoice.lpDSBvoice->_this, (void*)pDSLockedBuffer0, dwDSLockedBufferSize0,
|
MockingboardVoice->Unlock(MockingboardVoice->_this, (void*)pDSLockedBuffer0, dwDSLockedBufferSize0,
|
||||||
#else
|
#else
|
||||||
hr = MockingboardVoice.lpDSBvoice->Unlock((void*)pDSLockedBuffer0, dwDSLockedBufferSize0,
|
hr = MockingboardVoice->Unlock((void*)pDSLockedBuffer0, dwDSLockedBufferSize0,
|
||||||
#endif
|
#endif
|
||||||
(void*)pDSLockedBuffer1, dwDSLockedBufferSize1);
|
(void*)pDSLockedBuffer1, dwDSLockedBufferSize1);
|
||||||
|
|
||||||
@ -1162,10 +1158,10 @@ static unsigned long SSI263Thread(void *lpParameter)
|
|||||||
bool sample_finished = false;
|
bool sample_finished = false;
|
||||||
for (unsigned int i=0; i<MAX_VOICES; i++)
|
for (unsigned int i=0; i<MAX_VOICES; i++)
|
||||||
{
|
{
|
||||||
if (SSI263Voice[i].lpDSBvoice && SSI263Voice[i].bActive)
|
if (SSI263Voice[i] && SSI263Voice[i]->bActive)
|
||||||
{
|
{
|
||||||
unsigned long status = 0;
|
unsigned long status = 0;
|
||||||
SSI263Voice[i].lpDSBvoice->GetStatus(SSI263Voice[i].lpDSBvoice, &status);
|
SSI263Voice[i]->GetStatus(SSI263Voice[i], &status);
|
||||||
|
|
||||||
if (status & AUDIO_STATUS_NOTPLAYING)
|
if (status & AUDIO_STATUS_NOTPLAYING)
|
||||||
{
|
{
|
||||||
@ -1205,7 +1201,7 @@ static unsigned long SSI263Thread(void *lpParameter)
|
|||||||
//if(g_fh) fprintf(g_fh, "IRQ: Phoneme complete (0x%02X)\n\n", g_nCurrentActivePhoneme);
|
//if(g_fh) fprintf(g_fh, "IRQ: Phoneme complete (0x%02X)\n\n", g_nCurrentActivePhoneme);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
SSI263Voice[g_nCurrentActivePhoneme].bActive = false;
|
SSI263Voice[g_nCurrentActivePhoneme]->bActive = false;
|
||||||
g_nCurrentActivePhoneme = -1;
|
g_nCurrentActivePhoneme = -1;
|
||||||
|
|
||||||
// Phoneme complete, so generate IRQ if necessary
|
// Phoneme complete, so generate IRQ if necessary
|
||||||
@ -1264,27 +1260,27 @@ static void SSI263_Play(unsigned int nPhoneme)
|
|||||||
// A write to DURPHON before previous phoneme has completed
|
// A write to DURPHON before previous phoneme has completed
|
||||||
g_bStopPhoneme = true;
|
g_bStopPhoneme = true;
|
||||||
#ifdef APPLE2IX
|
#ifdef APPLE2IX
|
||||||
hr = SSI263Voice[g_nCurrentActivePhoneme].lpDSBvoice->Stop(SSI263Voice[g_nCurrentActivePhoneme].lpDSBvoice->_this);
|
hr = SSI263Voice[g_nCurrentActivePhoneme]->Stop(SSI263Voice[g_nCurrentActivePhoneme]->_this);
|
||||||
#else
|
#else
|
||||||
hr = SSI263Voice[g_nCurrentActivePhoneme].lpDSBvoice->Stop();
|
hr = SSI263Voice[g_nCurrentActivePhoneme]->Stop();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
g_nCurrentActivePhoneme = nPhoneme;
|
g_nCurrentActivePhoneme = nPhoneme;
|
||||||
|
|
||||||
#ifdef APPLE2IX
|
#ifdef APPLE2IX
|
||||||
hr = SSI263Voice[g_nCurrentActivePhoneme].lpDSBvoice->Replay(SSI263Voice[g_nCurrentActivePhoneme].lpDSBvoice->_this);
|
hr = SSI263Voice[g_nCurrentActivePhoneme]->Replay(SSI263Voice[g_nCurrentActivePhoneme]->_this);
|
||||||
#else
|
#else
|
||||||
hr = SSI263Voice[g_nCurrentActivePhoneme].lpDSBvoice->SetCurrentPosition(0);
|
hr = SSI263Voice[g_nCurrentActivePhoneme]->SetCurrentPosition(0);
|
||||||
if(FAILED(hr))
|
if(FAILED(hr))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
hr = SSI263Voice[g_nCurrentActivePhoneme].lpDSBvoice->Play(0,0,0); // Not looping
|
hr = SSI263Voice[g_nCurrentActivePhoneme]->Play(0,0,0); // Not looping
|
||||||
#endif
|
#endif
|
||||||
if(FAILED(hr))
|
if(FAILED(hr))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
SSI263Voice[g_nCurrentActivePhoneme].bActive = true;
|
SSI263Voice[g_nCurrentActivePhoneme]->bActive = true;
|
||||||
#else
|
#else
|
||||||
int hr;
|
int hr;
|
||||||
bool bPause;
|
bool bPause;
|
||||||
@ -1306,9 +1302,9 @@ static void SSI263_Play(unsigned int nPhoneme)
|
|||||||
unsigned long dwDSLockedBufferSize = 0; // Size of the locked DirectSound buffer
|
unsigned long dwDSLockedBufferSize = 0; // Size of the locked DirectSound buffer
|
||||||
int16_t* pDSLockedBuffer;
|
int16_t* pDSLockedBuffer;
|
||||||
|
|
||||||
hr = SSI263Voice.lpDSBvoice->Stop();
|
hr = SSI263Voice->Stop();
|
||||||
|
|
||||||
if(!DSGetLock(SSI263Voice.lpDSBvoice, 0, 0, &pDSLockedBuffer, &dwDSLockedBufferSize, NULL, 0))
|
if(!DSGetLock(SSI263Voice, 0, 0, &pDSLockedBuffer, &dwDSLockedBufferSize, NULL, 0))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
unsigned int nPhonemeShortLength = g_nPhonemeInfo[nPhoneme].nLength;
|
unsigned int nPhonemeShortLength = g_nPhonemeInfo[nPhoneme].nLength;
|
||||||
@ -1340,14 +1336,14 @@ static void SSI263_Play(unsigned int nPhoneme)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef APPLE2IX
|
#ifdef APPLE2IX
|
||||||
hr = SSI263Voice.lpDSBvoice->Unlock(SSI263Voice.lpDSBvoice->_this, (void*)pDSLockedBuffer, dwDSLockedBufferSize, NULL, 0);
|
hr = SSI263Voice->Unlock(SSI263Voice->_this, (void*)pDSLockedBuffer, dwDSLockedBufferSize, NULL, 0);
|
||||||
#else
|
#else
|
||||||
hr = SSI263Voice.lpDSBvoice->Unlock((void*)pDSLockedBuffer, dwDSLockedBufferSize, NULL, 0);
|
hr = SSI263Voice->Unlock((void*)pDSLockedBuffer, dwDSLockedBufferSize, NULL, 0);
|
||||||
#endif
|
#endif
|
||||||
if(FAILED(hr))
|
if(FAILED(hr))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
hr = SSI263Voice.lpDSBvoice->Play(0,0,0); // Not looping
|
hr = SSI263Voice->Play(0,0,0); // Not looping
|
||||||
if(FAILED(hr))
|
if(FAILED(hr))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -1395,16 +1391,16 @@ static bool MB_DSInit()
|
|||||||
return false;
|
return false;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
MockingboardVoice.bActive = true;
|
MockingboardVoice->bActive = true;
|
||||||
|
|
||||||
// Volume might've been setup from value in Registry
|
// Volume might've been setup from value in Registry
|
||||||
if(!MockingboardVoice.nVolume)
|
if(!MockingboardVoice->nVolume)
|
||||||
MockingboardVoice.nVolume = DSBVOLUME_MAX;
|
MockingboardVoice->nVolume = DSBVOLUME_MAX;
|
||||||
|
|
||||||
#ifdef APPLE2IX
|
#ifdef APPLE2IX
|
||||||
hr = MockingboardVoice.lpDSBvoice->SetVolume(MockingboardVoice.lpDSBvoice, MockingboardVoice.nVolume);
|
hr = MockingboardVoice->SetVolume(MockingboardVoice, MockingboardVoice->nVolume);
|
||||||
#else
|
#else
|
||||||
hr = MockingboardVoice.lpDSBvoice->SetVolume(MockingboardVoice.nVolume);
|
hr = MockingboardVoice->SetVolume(MockingboardVoice->nVolume);
|
||||||
#endif
|
#endif
|
||||||
LOG("MB_DSInit: SetVolume(), hr=0x%08X\n", (unsigned int)hr);
|
LOG("MB_DSInit: SetVolume(), hr=0x%08X\n", (unsigned int)hr);
|
||||||
|
|
||||||
@ -1486,9 +1482,9 @@ static bool MB_DSInit()
|
|||||||
}
|
}
|
||||||
|
|
||||||
#ifdef APPLE2IX
|
#ifdef APPLE2IX
|
||||||
hr = !DSGetLock(SSI263Voice[i].lpDSBvoice, 0, 0, &pDSLockedBuffer, &dwDSLockedBufferSize, NULL, 0);
|
hr = !DSGetLock(SSI263Voice[i], 0, 0, &pDSLockedBuffer, &dwDSLockedBufferSize, NULL, 0);
|
||||||
#else
|
#else
|
||||||
hr = DSGetLock(SSI263Voice[i].lpDSBvoice, 0, 0, &pDSLockedBuffer, &dwDSLockedBufferSize, NULL, 0);
|
hr = DSGetLock(SSI263Voice[i], 0, 0, &pDSLockedBuffer, &dwDSLockedBufferSize, NULL, 0);
|
||||||
#endif
|
#endif
|
||||||
//LOG("MB_DSInit: (%02d) DSGetLock(), res=%d\n", i, hr ? 1 : 0); // WARNING: Lock acquired && doing heavy-weight logging
|
//LOG("MB_DSInit: (%02d) DSGetLock(), res=%d\n", i, hr ? 1 : 0); // WARNING: Lock acquired && doing heavy-weight logging
|
||||||
if(FAILED(hr))
|
if(FAILED(hr))
|
||||||
@ -1518,7 +1514,7 @@ static bool MB_DSInit()
|
|||||||
#ifdef APPLE2IX
|
#ifdef APPLE2IX
|
||||||
// Assume no way to get notification of sound finished, instead we will poll from mockingboard thread ...
|
// Assume no way to get notification of sound finished, instead we will poll from mockingboard thread ...
|
||||||
#else
|
#else
|
||||||
hr = SSI263Voice[i].lpDSBvoice->QueryInterface(IID_IDirectSoundNotify, (void **)&SSI263Voice[i].lpDSNotify);
|
hr = SSI263Voice[i]->QueryInterface(IID_IDirectSoundNotify, (void **)&SSI263Voice[i]->lpDSNotify);
|
||||||
//LOG("MB_DSInit: (%02d) QueryInterface(), hr=0x%08X\n", i, hr); // WARNING: Lock acquired && doing heavy-weight logging
|
//LOG("MB_DSInit: (%02d) QueryInterface(), hr=0x%08X\n", i, hr); // WARNING: Lock acquired && doing heavy-weight logging
|
||||||
if(FAILED(hr))
|
if(FAILED(hr))
|
||||||
{
|
{
|
||||||
@ -1532,7 +1528,7 @@ static bool MB_DSInit()
|
|||||||
PositionNotify.dwOffset = DSBPN_OFFSETSTOP; // End of buffer
|
PositionNotify.dwOffset = DSBPN_OFFSETSTOP; // End of buffer
|
||||||
PositionNotify.hEventNotify = g_hSSI263Event[0];
|
PositionNotify.hEventNotify = g_hSSI263Event[0];
|
||||||
|
|
||||||
hr = SSI263Voice[i].lpDSNotify->SetNotificationPositions(1, &PositionNotify);
|
hr = SSI263Voice[i]->lpDSNotify->SetNotificationPositions(1, &PositionNotify);
|
||||||
//LOG("MB_DSInit: (%02d) SetNotificationPositions(), hr=0x%08X\n", i, hr); // WARNING: Lock acquired && doing heavy-weight logging
|
//LOG("MB_DSInit: (%02d) SetNotificationPositions(), hr=0x%08X\n", i, hr); // WARNING: Lock acquired && doing heavy-weight logging
|
||||||
if(FAILED(hr))
|
if(FAILED(hr))
|
||||||
{
|
{
|
||||||
@ -1542,9 +1538,9 @@ static bool MB_DSInit()
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef APPLE2IX
|
#ifdef APPLE2IX
|
||||||
hr = SSI263Voice[i].lpDSBvoice->UnlockStaticBuffer(SSI263Voice[i].lpDSBvoice->_this, dwDSLockedBufferSize);
|
hr = SSI263Voice[i]->UnlockStaticBuffer(SSI263Voice[i]->_this, dwDSLockedBufferSize);
|
||||||
#else
|
#else
|
||||||
hr = SSI263Voice[i].lpDSBvoice->Unlock((void*)pDSLockedBuffer, dwDSLockedBufferSize, NULL, 0);
|
hr = SSI263Voice[i]->Unlock((void*)pDSLockedBuffer, dwDSLockedBufferSize, NULL, 0);
|
||||||
#endif
|
#endif
|
||||||
LOG("MB_DSInit: (%02d) Unlock(),hr=0x%08X\n", i, (unsigned int)hr);
|
LOG("MB_DSInit: (%02d) Unlock(),hr=0x%08X\n", i, (unsigned int)hr);
|
||||||
if(FAILED(hr))
|
if(FAILED(hr))
|
||||||
@ -1553,12 +1549,12 @@ static bool MB_DSInit()
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
SSI263Voice[i].bActive = false;
|
SSI263Voice[i]->bActive = false;
|
||||||
SSI263Voice[i].nVolume = MockingboardVoice.nVolume; // Use same volume as MB
|
SSI263Voice[i]->nVolume = MockingboardVoice->nVolume; // Use same volume as MB
|
||||||
#ifdef APPLE2IX
|
#ifdef APPLE2IX
|
||||||
hr = SSI263Voice[i].lpDSBvoice->SetVolume(SSI263Voice[i].lpDSBvoice, SSI263Voice[i].nVolume);
|
hr = SSI263Voice[i]->SetVolume(SSI263Voice[i], SSI263Voice[i]->nVolume);
|
||||||
#else
|
#else
|
||||||
hr = SSI263Voice[i].lpDSBvoice->SetVolume(SSI263Voice[i].nVolume);
|
hr = SSI263Voice[i]->SetVolume(SSI263Voice[i]->nVolume);
|
||||||
#endif
|
#endif
|
||||||
LOG("MB_DSInit: (%02d) SetVolume(), hr=0x%08X\n", i, (unsigned int)hr);
|
LOG("MB_DSInit: (%02d) SetVolume(), hr=0x%08X\n", i, (unsigned int)hr);
|
||||||
}
|
}
|
||||||
@ -1619,14 +1615,14 @@ static void MB_DSUninit()
|
|||||||
|
|
||||||
//
|
//
|
||||||
|
|
||||||
if(MockingboardVoice.lpDSBvoice && MockingboardVoice.bActive)
|
if(MockingboardVoice && MockingboardVoice->bActive)
|
||||||
{
|
{
|
||||||
#ifdef APPLE2IX
|
#ifdef APPLE2IX
|
||||||
MockingboardVoice.lpDSBvoice->Stop(MockingboardVoice.lpDSBvoice->_this);
|
MockingboardVoice->Stop(MockingboardVoice->_this);
|
||||||
#else
|
#else
|
||||||
MockingboardVoice.lpDSBvoice->Stop();
|
MockingboardVoice->Stop();
|
||||||
#endif
|
#endif
|
||||||
MockingboardVoice.bActive = false;
|
MockingboardVoice->bActive = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
DSReleaseSoundBuffer(&MockingboardVoice);
|
DSReleaseSoundBuffer(&MockingboardVoice);
|
||||||
@ -1635,14 +1631,14 @@ static void MB_DSUninit()
|
|||||||
|
|
||||||
for(int i=0; i<MAX_VOICES; i++)
|
for(int i=0; i<MAX_VOICES; i++)
|
||||||
{
|
{
|
||||||
if(SSI263Voice[i].lpDSBvoice && SSI263Voice[i].bActive)
|
if(SSI263Voice[i] && SSI263Voice[i]->bActive)
|
||||||
{
|
{
|
||||||
#ifdef APPLE2IX
|
#ifdef APPLE2IX
|
||||||
SSI263Voice[i].lpDSBvoice->Stop(SSI263Voice[i].lpDSBvoice->_this);
|
SSI263Voice[i]->Stop(SSI263Voice[i]->_this);
|
||||||
#else
|
#else
|
||||||
SSI263Voice[i].lpDSBvoice->Stop();
|
SSI263Voice[i]->Stop();
|
||||||
#endif
|
#endif
|
||||||
SSI263Voice[i].bActive = false;
|
SSI263Voice[i]->bActive = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
DSReleaseSoundBuffer(&SSI263Voice[i]);
|
DSReleaseSoundBuffer(&SSI263Voice[i]);
|
||||||
@ -1676,11 +1672,11 @@ static void MB_DSUninit()
|
|||||||
void MB_Initialize()
|
void MB_Initialize()
|
||||||
{
|
{
|
||||||
#ifdef APPLE2IX
|
#ifdef APPLE2IX
|
||||||
memset(SSI263Voice, 0x0, sizeof(VOICE)*MAX_VOICES);
|
memset(SSI263Voice, 0x0, sizeof(AudioBuffer_s)*MAX_VOICES);
|
||||||
#endif
|
#endif
|
||||||
if (g_bDisableDirectSoundMockingboard)
|
if (g_bDisableDirectSoundMockingboard)
|
||||||
{
|
{
|
||||||
MockingboardVoice.bMute = true;
|
MockingboardVoice->bMute = true;
|
||||||
g_SoundcardType = CT_Empty;
|
g_SoundcardType = CT_Empty;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -2039,21 +2035,21 @@ void MB_Mute()
|
|||||||
if(g_SoundcardType == CT_Empty)
|
if(g_SoundcardType == CT_Empty)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if(MockingboardVoice.bActive && !MockingboardVoice.bMute)
|
if(MockingboardVoice->bActive && !MockingboardVoice->bMute)
|
||||||
{
|
{
|
||||||
#ifdef APPLE2IX
|
#ifdef APPLE2IX
|
||||||
MockingboardVoice.lpDSBvoice->SetVolume(MockingboardVoice.lpDSBvoice, DSBVOLUME_MIN);
|
MockingboardVoice->SetVolume(MockingboardVoice, DSBVOLUME_MIN);
|
||||||
#else
|
#else
|
||||||
MockingboardVoice.lpDSBvoice->SetVolume(DSBVOLUME_MIN);
|
MockingboardVoice->SetVolume(DSBVOLUME_MIN);
|
||||||
#endif
|
#endif
|
||||||
MockingboardVoice.bMute = true;
|
MockingboardVoice->bMute = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(g_nCurrentActivePhoneme >= 0)
|
if(g_nCurrentActivePhoneme >= 0)
|
||||||
#ifdef APPLE2IX
|
#ifdef APPLE2IX
|
||||||
SSI263Voice[g_nCurrentActivePhoneme].lpDSBvoice->SetVolume(SSI263Voice[g_nCurrentActivePhoneme].lpDSBvoice, DSBVOLUME_MIN);
|
SSI263Voice[g_nCurrentActivePhoneme]->SetVolume(SSI263Voice[g_nCurrentActivePhoneme], DSBVOLUME_MIN);
|
||||||
#else
|
#else
|
||||||
SSI263Voice[g_nCurrentActivePhoneme].lpDSBvoice->SetVolume(DSBVOLUME_MIN);
|
SSI263Voice[g_nCurrentActivePhoneme]->SetVolume(DSBVOLUME_MIN);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2064,21 +2060,21 @@ void MB_Demute()
|
|||||||
if(g_SoundcardType == CT_Empty)
|
if(g_SoundcardType == CT_Empty)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if(MockingboardVoice.bActive && MockingboardVoice.bMute)
|
if(MockingboardVoice->bActive && MockingboardVoice->bMute)
|
||||||
{
|
{
|
||||||
#ifdef APPLE2IX
|
#ifdef APPLE2IX
|
||||||
MockingboardVoice.lpDSBvoice->SetVolume(MockingboardVoice.lpDSBvoice, MockingboardVoice.nVolume);
|
MockingboardVoice->SetVolume(MockingboardVoice, MockingboardVoice->nVolume);
|
||||||
#else
|
#else
|
||||||
MockingboardVoice.lpDSBvoice->SetVolume(MockingboardVoice.nVolume);
|
MockingboardVoice->SetVolume(MockingboardVoice->nVolume);
|
||||||
#endif
|
#endif
|
||||||
MockingboardVoice.bMute = false;
|
MockingboardVoice->bMute = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(g_nCurrentActivePhoneme >= 0)
|
if(g_nCurrentActivePhoneme >= 0)
|
||||||
#ifdef APPLE2IX
|
#ifdef APPLE2IX
|
||||||
SSI263Voice[g_nCurrentActivePhoneme].lpDSBvoice->SetVolume(SSI263Voice[g_nCurrentActivePhoneme].lpDSBvoice, SSI263Voice[g_nCurrentActivePhoneme].nVolume);
|
SSI263Voice[g_nCurrentActivePhoneme]->SetVolume(SSI263Voice[g_nCurrentActivePhoneme], SSI263Voice[g_nCurrentActivePhoneme]->nVolume);
|
||||||
#else
|
#else
|
||||||
SSI263Voice[g_nCurrentActivePhoneme].lpDSBvoice->SetVolume(SSI263Voice[g_nCurrentActivePhoneme].nVolume);
|
SSI263Voice[g_nCurrentActivePhoneme]->SetVolume(SSI263Voice[g_nCurrentActivePhoneme]->nVolume);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2205,7 +2201,7 @@ double MB_GetFramePeriod()
|
|||||||
|
|
||||||
bool MB_IsActive()
|
bool MB_IsActive()
|
||||||
{
|
{
|
||||||
if(!MockingboardVoice.bActive)
|
if(!MockingboardVoice->bActive)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// Ignore /g_bMBTimerIrqActive/ as timer's irq handler will access 6522 regs affecting /g_bMB_Active/
|
// Ignore /g_bMBTimerIrqActive/ as timer's irq handler will access 6522 regs affecting /g_bMB_Active/
|
||||||
@ -2230,13 +2226,13 @@ void MB_SetVolume(unsigned long dwVolume, unsigned long dwVolumeMax)
|
|||||||
dwVolumeMax >>= 2;
|
dwVolumeMax >>= 2;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
MockingboardVoice.nVolume = NewVolume(dwVolume, dwVolumeMax);
|
MockingboardVoice->nVolume = NewVolume(dwVolume, dwVolumeMax);
|
||||||
|
|
||||||
if(MockingboardVoice.bActive)
|
if(MockingboardVoice->bActive)
|
||||||
#ifdef APPLE2IX
|
#ifdef APPLE2IX
|
||||||
MockingboardVoice.lpDSBvoice->SetVolume(MockingboardVoice.lpDSBvoice, MockingboardVoice.nVolume);
|
MockingboardVoice->SetVolume(MockingboardVoice, MockingboardVoice->nVolume);
|
||||||
#else
|
#else
|
||||||
MockingboardVoice.lpDSBvoice->SetVolume(MockingboardVoice.nVolume);
|
MockingboardVoice->SetVolume(MockingboardVoice->nVolume);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -43,7 +43,7 @@ static AudioContext_s *g_lpDS = NULL;
|
|||||||
|
|
||||||
#define uMAX_VOICES 66
|
#define uMAX_VOICES 66
|
||||||
static unsigned int g_uNumVoices = 0;
|
static unsigned int g_uNumVoices = 0;
|
||||||
static VOICE* g_pVoices[uMAX_VOICES] = {NULL};
|
static AudioBuffer_s* g_pVoices[uMAX_VOICES] = {NULL};
|
||||||
|
|
||||||
//-------------------------------------
|
//-------------------------------------
|
||||||
|
|
||||||
@ -85,7 +85,7 @@ bool DSGetLock(AudioBuffer_s *pVoice, unsigned long dwOffset, unsigned long dwBy
|
|||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
int DSGetSoundBuffer(VOICE* pVoice, unsigned long dwFlags, unsigned long dwBufferSize, unsigned long nSampleRate, int nChannels)
|
long DSGetSoundBuffer(INOUT AudioBuffer_s **pVoice, unsigned long dwFlags, unsigned long dwBufferSize, unsigned long nSampleRate, int nChannels)
|
||||||
{
|
{
|
||||||
AudioParams_s params = { 0 };
|
AudioParams_s params = { 0 };
|
||||||
|
|
||||||
@ -96,34 +96,27 @@ int DSGetSoundBuffer(VOICE* pVoice, unsigned long dwFlags, unsigned long dwBuffe
|
|||||||
params.nAvgBytesPerSec = params.nBlockAlign * params.nSamplesPerSec;
|
params.nAvgBytesPerSec = params.nBlockAlign * params.nSamplesPerSec;
|
||||||
params.dwBufferBytes = dwBufferSize;
|
params.dwBufferBytes = dwBufferSize;
|
||||||
|
|
||||||
// Are buffers released when g_lpDS OR pVoice->lpDSBvoice is released?
|
if (*pVoice)
|
||||||
// . From DirectX doc:
|
|
||||||
// "Buffer objects are owned by the device object that created them. When the
|
|
||||||
// device object is released, all buffers created by that object are also released..."
|
|
||||||
if (pVoice->lpDSBvoice)
|
|
||||||
{
|
{
|
||||||
g_lpDS->DestroySoundBuffer(&pVoice->lpDSBvoice);
|
DSReleaseSoundBuffer(pVoice);
|
||||||
//DSReleaseSoundBuffer(pVoice);
|
|
||||||
}
|
}
|
||||||
int hr = g_lpDS->CreateSoundBuffer(¶ms, &pVoice->lpDSBvoice, g_lpDS);
|
int hr = g_lpDS->CreateSoundBuffer(¶ms, pVoice, g_lpDS);
|
||||||
if(hr)
|
if(hr)
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
//
|
|
||||||
|
|
||||||
assert(g_uNumVoices < uMAX_VOICES);
|
assert(g_uNumVoices < uMAX_VOICES);
|
||||||
if(g_uNumVoices < uMAX_VOICES)
|
if(g_uNumVoices < uMAX_VOICES)
|
||||||
g_pVoices[g_uNumVoices++] = pVoice;
|
g_pVoices[g_uNumVoices++] = *pVoice;
|
||||||
|
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DSReleaseSoundBuffer(VOICE* pVoice)
|
void DSReleaseSoundBuffer(INOUT AudioBuffer_s **pVoice)
|
||||||
{
|
{
|
||||||
|
|
||||||
for(unsigned int i=0; i<g_uNumVoices; i++)
|
for(unsigned int i=0; i<g_uNumVoices; i++)
|
||||||
{
|
{
|
||||||
if(g_pVoices[i] == pVoice)
|
if(g_pVoices[i] == *pVoice)
|
||||||
{
|
{
|
||||||
g_pVoices[i] = g_pVoices[g_uNumVoices-1];
|
g_pVoices[i] = g_pVoices[g_uNumVoices-1];
|
||||||
g_pVoices[g_uNumVoices-1] = NULL;
|
g_pVoices[g_uNumVoices-1] = NULL;
|
||||||
@ -134,26 +127,26 @@ void DSReleaseSoundBuffer(VOICE* pVoice)
|
|||||||
|
|
||||||
if (g_lpDS)
|
if (g_lpDS)
|
||||||
{
|
{
|
||||||
g_lpDS->DestroySoundBuffer(&pVoice->lpDSBvoice);
|
g_lpDS->DestroySoundBuffer(pVoice);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
bool DSZeroVoiceBuffer(VOICE *Voice, char* pszDevName, unsigned long dwBufferSize)
|
bool DSZeroVoiceBuffer(AudioBuffer_s *pVoice, char* pszDevName, unsigned long dwBufferSize)
|
||||||
{
|
{
|
||||||
unsigned long dwDSLockedBufferSize = 0; // Size of the locked DirectSound buffer
|
unsigned long dwDSLockedBufferSize = 0; // Size of the locked DirectSound buffer
|
||||||
int16_t* pDSLockedBuffer;
|
int16_t* pDSLockedBuffer;
|
||||||
|
|
||||||
|
|
||||||
unsigned long argX = 0;
|
unsigned long argX = 0;
|
||||||
int hr = Voice->lpDSBvoice->Stop(Voice->lpDSBvoice->_this);
|
int hr = pVoice->Stop(pVoice->_this);
|
||||||
if(hr)
|
if(hr)
|
||||||
{
|
{
|
||||||
LOG("%s: DSStop failed (%08X)\n",pszDevName,(unsigned int)hr);
|
LOG("%s: DSStop failed (%08X)\n",pszDevName,(unsigned int)hr);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
hr = !DSGetLock(Voice->lpDSBvoice, 0, 0, &pDSLockedBuffer, &dwDSLockedBufferSize, NULL, &argX);
|
hr = !DSGetLock(pVoice, 0, 0, &pDSLockedBuffer, &dwDSLockedBufferSize, NULL, &argX);
|
||||||
if(hr)
|
if(hr)
|
||||||
{
|
{
|
||||||
LOG("%s: DSGetLock failed (%08X)\n",pszDevName,(unsigned int)hr);
|
LOG("%s: DSGetLock failed (%08X)\n",pszDevName,(unsigned int)hr);
|
||||||
@ -163,14 +156,14 @@ bool DSZeroVoiceBuffer(VOICE *Voice, char* pszDevName, unsigned long dwBufferSiz
|
|||||||
assert(dwDSLockedBufferSize == dwBufferSize);
|
assert(dwDSLockedBufferSize == dwBufferSize);
|
||||||
memset(pDSLockedBuffer, 0x00, dwDSLockedBufferSize);
|
memset(pDSLockedBuffer, 0x00, dwDSLockedBufferSize);
|
||||||
|
|
||||||
hr = Voice->lpDSBvoice->Unlock(Voice->lpDSBvoice->_this, (void*)pDSLockedBuffer, dwDSLockedBufferSize, NULL, argX);
|
hr = pVoice->Unlock(pVoice->_this, (void*)pDSLockedBuffer, dwDSLockedBufferSize, NULL, argX);
|
||||||
if(hr)
|
if(hr)
|
||||||
{
|
{
|
||||||
LOG("%s: DSUnlock failed (%08X)\n",pszDevName,(unsigned int)hr);
|
LOG("%s: DSUnlock failed (%08X)\n",pszDevName,(unsigned int)hr);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
hr = Voice->lpDSBvoice->Play(Voice->lpDSBvoice->_this,0,0,0);
|
hr = pVoice->Play(pVoice->_this,0,0,0);
|
||||||
if(hr)
|
if(hr)
|
||||||
{
|
{
|
||||||
LOG("%s: DSPlay failed (%08X)\n",pszDevName,(unsigned int)hr);
|
LOG("%s: DSPlay failed (%08X)\n",pszDevName,(unsigned int)hr);
|
||||||
@ -182,13 +175,13 @@ bool DSZeroVoiceBuffer(VOICE *Voice, char* pszDevName, unsigned long dwBufferSiz
|
|||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
|
||||||
bool DSZeroVoiceWritableBuffer(VOICE *Voice, char* pszDevName, unsigned long dwBufferSize)
|
bool DSZeroVoiceWritableBuffer(AudioBuffer_s *pVoice, char* pszDevName, unsigned long dwBufferSize)
|
||||||
{
|
{
|
||||||
unsigned long dwDSLockedBufferSize0=0, dwDSLockedBufferSize1=0;
|
unsigned long dwDSLockedBufferSize0=0, dwDSLockedBufferSize1=0;
|
||||||
int16_t *pDSLockedBuffer0, *pDSLockedBuffer1;
|
int16_t *pDSLockedBuffer0, *pDSLockedBuffer1;
|
||||||
|
|
||||||
|
|
||||||
int hr = DSGetLock(Voice->lpDSBvoice,
|
int hr = DSGetLock(pVoice,
|
||||||
0, dwBufferSize,
|
0, dwBufferSize,
|
||||||
&pDSLockedBuffer0, &dwDSLockedBufferSize0,
|
&pDSLockedBuffer0, &dwDSLockedBufferSize0,
|
||||||
&pDSLockedBuffer1, &dwDSLockedBufferSize1);
|
&pDSLockedBuffer1, &dwDSLockedBufferSize1);
|
||||||
@ -203,7 +196,7 @@ bool DSZeroVoiceWritableBuffer(VOICE *Voice, char* pszDevName, unsigned long dwB
|
|||||||
if(pDSLockedBuffer1)
|
if(pDSLockedBuffer1)
|
||||||
memset(pDSLockedBuffer1, 0x00, dwDSLockedBufferSize1);
|
memset(pDSLockedBuffer1, 0x00, dwDSLockedBufferSize1);
|
||||||
|
|
||||||
hr = Voice->lpDSBvoice->Unlock(Voice->lpDSBvoice->_this, (void*)pDSLockedBuffer0, dwDSLockedBufferSize0,
|
hr = pVoice->Unlock(pVoice->_this, (void*)pDSLockedBuffer0, dwDSLockedBufferSize0,
|
||||||
(void*)pDSLockedBuffer1, dwDSLockedBufferSize1);
|
(void*)pDSLockedBuffer1, dwDSLockedBufferSize1);
|
||||||
if(hr)
|
if(hr)
|
||||||
{
|
{
|
||||||
|
@ -22,8 +22,11 @@
|
|||||||
#define AUDIO_STATUS_NOTPLAYING 0x08000000
|
#define AUDIO_STATUS_NOTPLAYING 0x08000000
|
||||||
|
|
||||||
typedef struct AudioBuffer_s {
|
typedef struct AudioBuffer_s {
|
||||||
|
bool bActive; // Playback is active
|
||||||
|
bool bMute;
|
||||||
|
long nVolume; // Current volume (as used by DirectSound)
|
||||||
void *_this;
|
void *_this;
|
||||||
|
#warning TODO rename _this variable to indicate that it is implementation_specific
|
||||||
|
|
||||||
long (*SetVolume)(void* _this, long lVolume);
|
long (*SetVolume)(void* _this, long lVolume);
|
||||||
|
|
||||||
@ -67,24 +70,16 @@ typedef struct AudioContext_s {
|
|||||||
long (*DestroySoundBuffer)(INOUT AudioBuffer_s **buffer);
|
long (*DestroySoundBuffer)(INOUT AudioBuffer_s **buffer);
|
||||||
} AudioContext_s;
|
} AudioContext_s;
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
AudioBuffer_s *lpDSBvoice;
|
|
||||||
bool bActive; // Playback is active
|
|
||||||
bool bMute;
|
|
||||||
long nVolume; // Current volume (as used by DirectSound)
|
|
||||||
} VOICE;
|
|
||||||
|
|
||||||
|
|
||||||
bool DSGetLock(AudioBuffer_s *pVoice, unsigned long dwOffset, unsigned long dwBytes,
|
bool DSGetLock(AudioBuffer_s *pVoice, unsigned long dwOffset, unsigned long dwBytes,
|
||||||
int16_t** ppDSLockedBuffer0, unsigned long* pdwDSLockedBufferSize0,
|
int16_t** ppDSLockedBuffer0, unsigned long* pdwDSLockedBufferSize0,
|
||||||
int16_t** ppDSLockedBuffer1, unsigned long* pdwDSLockedBufferSize1);
|
int16_t** ppDSLockedBuffer1, unsigned long* pdwDSLockedBufferSize1);
|
||||||
|
|
||||||
int DSGetSoundBuffer(VOICE* pVoice, unsigned long dwFlags, unsigned long dwBufferSize, unsigned long nSampleRate, int nChannels);
|
long DSGetSoundBuffer(INOUT AudioBuffer_s **pVoice, unsigned long dwFlags, unsigned long dwBufferSize, unsigned long nSampleRate, int nChannels);
|
||||||
void DSReleaseSoundBuffer(VOICE* pVoice);
|
void DSReleaseSoundBuffer(INOUT AudioBuffer_s **pVoice);
|
||||||
|
|
||||||
bool DSZeroVoiceBuffer(VOICE *Voice, char* pszDevName, unsigned long dwBufferSize);
|
bool DSZeroVoiceBuffer(AudioBuffer_s *pVoice, char *pszDevName, unsigned long dwBufferSize);
|
||||||
bool DSZeroVoiceWritableBuffer(VOICE *Voice, char* pszDevName, unsigned long dwBufferSize);
|
bool DSZeroVoiceWritableBuffer(AudioBuffer_s *pVoice, char *pszDevName, unsigned long dwBufferSize);
|
||||||
|
|
||||||
typedef enum eFADE {FADE_NONE, FADE_IN, FADE_OUT} eFADE;
|
typedef enum eFADE {FADE_NONE, FADE_IN, FADE_OUT} eFADE;
|
||||||
void SoundCore_SetFade(eFADE FadeType);
|
void SoundCore_SetFade(eFADE FadeType);
|
||||||
|
@ -57,7 +57,7 @@ static unsigned int speaker_silent_step = 0;
|
|||||||
|
|
||||||
static int samples_adjustment_counter = 0;
|
static int samples_adjustment_counter = 0;
|
||||||
|
|
||||||
static VOICE SpeakerVoice = { 0 };
|
static AudioBuffer_s *speakerBuffer = NULL;
|
||||||
|
|
||||||
// --------------------------------------------------------------------------------------------------------------------
|
// --------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
@ -202,12 +202,8 @@ static void _speaker_update(/*bool toggled*/) {
|
|||||||
static void _submit_samples_buffer_fullspeed(void) {
|
static void _submit_samples_buffer_fullspeed(void) {
|
||||||
samples_adjustment_counter = 0;
|
samples_adjustment_counter = 0;
|
||||||
|
|
||||||
if (!SpeakerVoice.bActive) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned long bytes_queued = 0;
|
unsigned long bytes_queued = 0;
|
||||||
long err = SpeakerVoice.lpDSBvoice->GetCurrentPosition(SpeakerVoice.lpDSBvoice->_this, &bytes_queued, NULL);
|
long err = speakerBuffer->GetCurrentPosition(speakerBuffer->_this, &bytes_queued, NULL);
|
||||||
if (err) {
|
if (err) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -224,7 +220,7 @@ static void _submit_samples_buffer_fullspeed(void) {
|
|||||||
|
|
||||||
unsigned long system_buffer_size = 0;
|
unsigned long system_buffer_size = 0;
|
||||||
int16_t *system_samples_buffer = NULL;
|
int16_t *system_samples_buffer = NULL;
|
||||||
if (!DSGetLock(SpeakerVoice.lpDSBvoice, /*unused*/ 0, num_samples_pad*sizeof(int16_t), &system_samples_buffer, &system_buffer_size, NULL, NULL)) {
|
if (!DSGetLock(speakerBuffer, /*unused*/ 0, num_samples_pad*sizeof(int16_t), &system_samples_buffer, &system_buffer_size, NULL, NULL)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
assert(num_samples_pad*sizeof(int16_t) <= system_buffer_size);
|
assert(num_samples_pad*sizeof(int16_t) <= system_buffer_size);
|
||||||
@ -234,7 +230,7 @@ static void _submit_samples_buffer_fullspeed(void) {
|
|||||||
system_samples_buffer[i] = speaker_data;
|
system_samples_buffer[i] = speaker_data;
|
||||||
}
|
}
|
||||||
|
|
||||||
SpeakerVoice.lpDSBvoice->Unlock(SpeakerVoice.lpDSBvoice->_this, (void*)system_samples_buffer, system_buffer_size, NULL, 0);
|
speakerBuffer->Unlock(speakerBuffer->_this, (void*)system_samples_buffer, system_buffer_size, NULL, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Submits samples from the samples_buffer to the audio system backend when running at a normal scaled-speed. This also
|
// Submits samples from the samples_buffer to the audio system backend when running at a normal scaled-speed. This also
|
||||||
@ -244,12 +240,8 @@ static unsigned int _submit_samples_buffer(const unsigned int num_samples) {
|
|||||||
|
|
||||||
assert(num_samples);
|
assert(num_samples);
|
||||||
|
|
||||||
if (!SpeakerVoice.bActive) {
|
|
||||||
return num_samples;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned long bytes_queued = 0;
|
unsigned long bytes_queued = 0;
|
||||||
long err = SpeakerVoice.lpDSBvoice->GetCurrentPosition(SpeakerVoice.lpDSBvoice->_this, &bytes_queued, NULL);
|
long err = speakerBuffer->GetCurrentPosition(speakerBuffer->_this, &bytes_queued, NULL);
|
||||||
if (err) {
|
if (err) {
|
||||||
return num_samples;
|
return num_samples;
|
||||||
}
|
}
|
||||||
@ -295,13 +287,13 @@ static unsigned int _submit_samples_buffer(const unsigned int num_samples) {
|
|||||||
unsigned long system_buffer_size = 0;
|
unsigned long system_buffer_size = 0;
|
||||||
int16_t *system_samples_buffer = NULL;
|
int16_t *system_samples_buffer = NULL;
|
||||||
|
|
||||||
if (!DSGetLock(SpeakerVoice.lpDSBvoice, /*unused*/0, (unsigned long)num_samples_to_use*sizeof(int16_t), &system_samples_buffer, &system_buffer_size, NULL, NULL)) {
|
if (!DSGetLock(speakerBuffer, /*unused*/0, (unsigned long)num_samples_to_use*sizeof(int16_t), &system_samples_buffer, &system_buffer_size, NULL, NULL)) {
|
||||||
return num_samples;
|
return num_samples;
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(system_samples_buffer, &samples_buffer[0], system_buffer_size);
|
memcpy(system_samples_buffer, &samples_buffer[0], system_buffer_size);
|
||||||
|
|
||||||
err = SpeakerVoice.lpDSBvoice->Unlock(SpeakerVoice.lpDSBvoice->_this, (void*)system_samples_buffer, system_buffer_size, NULL, 0);
|
err = speakerBuffer->Unlock(speakerBuffer->_this, (void*)system_samples_buffer, system_buffer_size, NULL, 0);
|
||||||
if (err) {
|
if (err) {
|
||||||
return num_samples;
|
return num_samples;
|
||||||
}
|
}
|
||||||
@ -314,16 +306,14 @@ static unsigned int _submit_samples_buffer(const unsigned int num_samples) {
|
|||||||
// speaker public API functions
|
// speaker public API functions
|
||||||
|
|
||||||
void speaker_destroy(void) {
|
void speaker_destroy(void) {
|
||||||
if (SpeakerVoice.lpDSBvoice && SpeakerVoice.bActive) {
|
if (speakerBuffer) {
|
||||||
SpeakerVoice.lpDSBvoice->Stop(SpeakerVoice.lpDSBvoice->_this);
|
speakerBuffer->Stop(speakerBuffer->_this);
|
||||||
SpeakerVoice.bActive = false;
|
|
||||||
}
|
}
|
||||||
DSReleaseSoundBuffer(&SpeakerVoice);
|
DSReleaseSoundBuffer(&speakerBuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
void speaker_init(void) {
|
void speaker_init(void) {
|
||||||
SpeakerVoice.bActive = true;
|
long err = DSGetSoundBuffer(&speakerBuffer, 0, SOUNDCORE_BUFFER_SIZE, SPKR_SAMPLE_RATE, 1);
|
||||||
long err = DSGetSoundBuffer(&SpeakerVoice, 0, SOUNDCORE_BUFFER_SIZE, SPKR_SAMPLE_RATE, 1);
|
|
||||||
assert(!err);
|
assert(!err);
|
||||||
_speaker_init_timing();
|
_speaker_init_timing();
|
||||||
}
|
}
|
||||||
@ -382,7 +372,7 @@ void speaker_flush(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool speaker_is_active(void) {
|
bool speaker_is_active(void) {
|
||||||
return SpeakerVoice.bActive && speaker_recently_active;
|
return speaker_recently_active;
|
||||||
}
|
}
|
||||||
|
|
||||||
void speaker_set_volume(int16_t amplitude) {
|
void speaker_set_volume(int16_t amplitude) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user