Fix MP3 player

This commit is contained in:
erorcun 2021-02-19 14:30:41 +03:00
parent bf7280b55b
commit 139c6bfcf3
2 changed files with 176 additions and 196 deletions

View file

@ -2046,55 +2046,95 @@ cSampleManager::StartPreloadedStreamedFile(uint8 nStream)
bool bool
cSampleManager::StartStreamedFile(uint8 nFile, uint32 nPos, uint8 nStream) cSampleManager::StartStreamedFile(uint8 nFile, uint32 nPos, uint8 nStream)
{ {
int i = 0;
uint32 position = nPos; uint32 position = nPos;
char filename[MAX_PATH]; char filename[MAX_PATH];
if ( m_bInitialised && nFile < TOTAL_STREAMED_SOUNDS ) if ( !m_bInitialised || nFile >= TOTAL_STREAMED_SOUNDS )
{ return false;
if ( mp3Stream[nStream] ) if ( mp3Stream[nStream] )
{ {
AIL_pause_stream(mp3Stream[nStream], 1); AIL_pause_stream(mp3Stream[nStream], 1);
AIL_close_stream(mp3Stream[nStream]); AIL_close_stream(mp3Stream[nStream]);
} }
if ( nFile == STREAMED_SOUND_RADIO_MP3_PLAYER ) if ( nFile == STREAMED_SOUND_RADIO_MP3_PLAYER )
{ {
uint32 i = 0; do
do { {
if(i != 0 || _bIsMp3Active) { // Just switched to MP3 player
if ( !_bIsMp3Active && i == 0 )
{
if ( nPos > nStreamLength[STREAMED_SOUND_RADIO_MP3_PLAYER] )
position = 0;
tMP3Entry *e = _pMP3List;
// Try to continue from previous song, if already started
if(!_GetMP3PosFromStreamPos(&position, &e) && !e) {
nFile = 0;
strcpy(filename, m_szCDRomRootPath);
strcat(filename, StreamedNameTable[nFile]);
mp3Stream[nStream] = AIL_open_stream(DIG, filename, 0);
if ( mp3Stream[nStream] )
{
AIL_set_stream_loop_count(mp3Stream[nStream], 1);
AIL_set_stream_ms_position(mp3Stream[nStream], position);
AIL_pause_stream(mp3Stream[nStream], 0);
return true;
}
return false;
} else {
if ( e->pLinkPath != NULL )
mp3Stream[nStream] = AIL_open_stream(DIG, e->pLinkPath, 0);
else {
strcpy(filename, _mp3DirectoryPath);
strcat(filename, e->aFilename);
mp3Stream[nStream] = AIL_open_stream(DIG, filename, 0);
}
if ( mp3Stream[nStream] ) {
AIL_set_stream_loop_count(mp3Stream[nStream], 1);
AIL_set_stream_ms_position(mp3Stream[nStream], position);
AIL_pause_stream(mp3Stream[nStream], 0);
_bIsMp3Active = true;
return true;
}
// fall through, start playing from another song
}
} else {
if(++_CurMP3Index >= nNumMP3s) _CurMP3Index = 0; if(++_CurMP3Index >= nNumMP3s) _CurMP3Index = 0;
_CurMP3Pos = 0; _CurMP3Pos = 0;
tMP3Entry *mp3 = _GetMP3EntryByIndex(_CurMP3Index); tMP3Entry *mp3 = _GetMP3EntryByIndex(_CurMP3Index);
if ( !mp3 )
if(mp3) { {
mp3 = _pMP3List; mp3 = _pMP3List;
if(mp3 == NULL) { if ( !_pMP3List )
_bIsMp3Active = false; {
nFile = 0; nFile = 0;
_bIsMp3Active = 0;
strcpy(filename, m_szCDRomRootPath); strcpy(filename, m_szCDRomRootPath);
strcat(filename, StreamedNameTable[nFile]); strcat(filename, StreamedNameTable[nFile]);
mp3Stream[nStream] = mp3Stream[nStream] = AIL_open_stream(DIG, filename, 0);
AIL_open_stream(DIG, filename, 0); if ( mp3Stream[nStream] )
if(mp3Stream[nStream]) { {
AIL_set_stream_loop_count( AIL_set_stream_loop_count(mp3Stream[nStream], 1);
mp3Stream[nStream], 1); AIL_set_stream_ms_position(mp3Stream[nStream], position);
AIL_set_stream_ms_position( AIL_pause_stream(mp3Stream[nStream], 0);
mp3Stream[nStream], position);
AIL_pause_stream(mp3Stream[nStream],
0);
return true; return true;
} }
return false; return false;
} }
} }
if(mp3->pLinkPath != NULL) if(mp3->pLinkPath != NULL)
mp3Stream[nStream] = mp3Stream[nStream] = AIL_open_stream(DIG, mp3->pLinkPath, 0);
AIL_open_stream(DIG, mp3->pLinkPath, 0);
else { else {
strcpy(filename, _mp3DirectoryPath); strcpy(filename, _mp3DirectoryPath);
strcat(filename, mp3->aFilename); strcat(filename, mp3->aFilename);
@ -2107,67 +2147,19 @@ cSampleManager::StartStreamedFile(uint8 nFile, uint32 nPos, uint8 nStream)
AIL_set_stream_loop_count(mp3Stream[nStream], 1); AIL_set_stream_loop_count(mp3Stream[nStream], 1);
AIL_set_stream_ms_position(mp3Stream[nStream], 0); AIL_set_stream_ms_position(mp3Stream[nStream], 0);
AIL_pause_stream(mp3Stream[nStream], 0); AIL_pause_stream(mp3Stream[nStream], 0);
return true; #ifdef FIX_BUGS
}
_bIsMp3Active = false;
continue;
}
if ( nPos > nStreamLength[STREAMED_SOUND_RADIO_MP3_PLAYER] )
position = 0;
tMP3Entry *e;
if ( !_GetMP3PosFromStreamPos(&position, &e) )
{
if ( e == NULL )
{
nFile = 0;
strcpy(filename, m_szCDRomRootPath);
strcat(filename, StreamedNameTable[nFile]);
mp3Stream[nStream] =
AIL_open_stream(DIG, filename, 0);
if(mp3Stream[nStream]) {
AIL_set_stream_loop_count(
mp3Stream[nStream], 1);
AIL_set_stream_ms_position(
mp3Stream[nStream], position);
AIL_pause_stream(mp3Stream[nStream], 0);
return true;
}
return false;
}
}
if ( e->pLinkPath != NULL )
mp3Stream[nStream] = AIL_open_stream(DIG, e->pLinkPath, 0);
else
{
strcpy(filename, _mp3DirectoryPath);
strcat(filename, e->aFilename);
mp3Stream[nStream] = AIL_open_stream(DIG, filename, 0);
}
if ( mp3Stream[nStream] )
{
AIL_set_stream_loop_count(mp3Stream[nStream], 1);
AIL_set_stream_ms_position(mp3Stream[nStream], position);
AIL_pause_stream(mp3Stream[nStream], 0);
_bIsMp3Active = true; _bIsMp3Active = true;
#endif
return true; return true;
} }
_bIsMp3Active = false; }
_bIsMp3Active = 0;
} while(++i < nNumMP3s); }
while ( ++i < nNumMP3s );
position = 0; position = 0;
nFile = 0; nFile = 0;
} }
strcpy(filename, m_szCDRomRootPath); strcpy(filename, m_szCDRomRootPath);
strcat(filename, StreamedNameTable[nFile]); strcat(filename, StreamedNameTable[nFile]);
@ -2179,8 +2171,6 @@ cSampleManager::StartStreamedFile(uint8 nFile, uint32 nPos, uint8 nStream)
AIL_pause_stream(mp3Stream[nStream], 0); AIL_pause_stream(mp3Stream[nStream], 0);
return true; return true;
} }
}
return false; return false;
} }

View file

@ -730,8 +730,6 @@ _FindMP3s(void)
delete aStream[0]; delete aStream[0];
aStream[0] = NULL; aStream[0] = NULL;
OutputDebugString(fd.cFileName);
pList->pNext = new tMP3Entry; pList->pNext = new tMP3Entry;
tMP3Entry *e = pList->pNext; tMP3Entry *e = pList->pNext;
@ -1706,91 +1704,35 @@ cSampleManager::StartPreloadedStreamedFile(uint8 nStream)
bool bool
cSampleManager::StartStreamedFile(uint8 nFile, uint32 nPos, uint8 nStream) cSampleManager::StartStreamedFile(uint8 nFile, uint32 nPos, uint8 nStream)
{ {
int i = 0;
uint32 position = nPos; uint32 position = nPos;
char filename[256]; char filename[MAX_PATH];
ASSERT( nStream < MAX_STREAMS ); if ( nFile >= TOTAL_STREAMED_SOUNDS )
return false;
if ( nFile < TOTAL_STREAMED_SOUNDS )
{
if ( aStream[nStream] ) if ( aStream[nStream] )
{ {
delete aStream[nStream]; delete aStream[nStream];
aStream[nStream] = NULL; aStream[nStream] = NULL;
} }
if ( nFile == STREAMED_SOUND_RADIO_MP3_PLAYER ) if ( nFile == STREAMED_SOUND_RADIO_MP3_PLAYER )
{ {
uint32 i = 0; do
do { {
if(i != 0 || _bIsMp3Active) { // Switched to MP3 player just now
if(++_CurMP3Index >= nNumMP3s) _CurMP3Index = 0; if ( !_bIsMp3Active && i == 0 )
{
_CurMP3Pos = 0;
tMP3Entry *mp3 = _GetMP3EntryByIndex(_CurMP3Index);
if(mp3) {
mp3 = _pMP3List;
if(mp3 == NULL) {
_bIsMp3Active = false;
nFile = 0;
strcat(filename, StreamedNameTable[nFile]);
CStream* stream = new CStream(filename, ALStreamSources[nStream], ALStreamBuffers[nStream], IsThisTrackAt16KHz(nFile) ? 16000 : 32000);
ASSERT(stream != NULL);
aStream[nStream] = stream;
if (stream->Setup()) {
if (position != 0)
stream->SetPosMS(position);
stream->Start();
return true;
} else {
delete stream;
aStream[nStream] = NULL;
}
return false;
}
}
if (mp3->pLinkPath != NULL)
aStream[nStream] = new CStream(mp3->pLinkPath, ALStreamSources[nStream], ALStreamBuffers[nStream], IsThisTrackAt16KHz(nFile) ? 16000 : 32000);
else {
strcpy(filename, _mp3DirectoryPath);
strcat(filename, mp3->aFilename);
aStream[nStream] = new CStream(filename, ALStreamSources[nStream], ALStreamBuffers[nStream], IsThisTrackAt16KHz(nFile) ? 16000 : 32000);
}
if (aStream[nStream]->Setup()) {
aStream[nStream]->Start();
return true;
} else {
delete aStream[nStream];
aStream[nStream] = NULL;
}
_bIsMp3Active = false;
continue;
}
if ( nPos > nStreamLength[STREAMED_SOUND_RADIO_MP3_PLAYER] ) if ( nPos > nStreamLength[STREAMED_SOUND_RADIO_MP3_PLAYER] )
position = 0; position = 0;
tMP3Entry *e = _pMP3List;
tMP3Entry *e; // Try to continue from previous song, if already started
if ( !_GetMP3PosFromStreamPos(&position, &e) ) if(!_GetMP3PosFromStreamPos(&position, &e) && !e) {
{
if ( e == NULL )
{
nFile = 0; nFile = 0;
strcat(filename, StreamedNameTable[nFile]); strcpy(filename, StreamedNameTable[nFile]);
CStream* stream = new CStream(filename, ALStreamSources[nStream], ALStreamBuffers[nStream], IsThisTrackAt16KHz(nFile) ? 16000 : 32000); CStream* stream = new CStream(filename, ALStreamSources[nStream], ALStreamBuffers[nStream], IsThisTrackAt16KHz(nFile) ? 16000 : 32000);
ASSERT(stream != NULL);
aStream[nStream] = stream; aStream[nStream] = stream;
@ -1805,11 +1747,9 @@ cSampleManager::StartStreamedFile(uint8 nFile, uint32 nPos, uint8 nStream)
delete stream; delete stream;
aStream[nStream] = NULL; aStream[nStream] = NULL;
} }
return false; return false;
}
}
} else {
if ( e->pLinkPath != NULL ) if ( e->pLinkPath != NULL )
aStream[nStream] = new CStream(e->pLinkPath, ALStreamSources[nStream], ALStreamBuffers[nStream], IsThisTrackAt16KHz(nFile) ? 16000 : 32000); aStream[nStream] = new CStream(e->pLinkPath, ALStreamSources[nStream], ALStreamBuffers[nStream], IsThisTrackAt16KHz(nFile) ? 16000 : 32000);
else { else {
@ -1831,19 +1771,24 @@ cSampleManager::StartStreamedFile(uint8 nFile, uint32 nPos, uint8 nStream)
delete aStream[nStream]; delete aStream[nStream];
aStream[nStream] = NULL; aStream[nStream] = NULL;
} }
// fall through, start playing from another song
_bIsMp3Active = false;
} while(++i < nNumMP3s);
position = 0;
nFile = 0;
} }
} else {
if(++_CurMP3Index >= nNumMP3s) _CurMP3Index = 0;
_CurMP3Pos = 0;
tMP3Entry *mp3 = _GetMP3EntryByIndex(_CurMP3Index);
if ( !mp3 )
{
mp3 = _pMP3List;
if ( !_pMP3List )
{
nFile = 0;
_bIsMp3Active = 0;
strcpy(filename, StreamedNameTable[nFile]); strcpy(filename, StreamedNameTable[nFile]);
CStream* stream = new CStream(filename, ALStreamSources[nStream], ALStreamBuffers[nStream], IsThisTrackAt16KHz(nFile) ? 16000 : 32000); CStream* stream = new CStream(filename, ALStreamSources[nStream], ALStreamBuffers[nStream], IsThisTrackAt16KHz(nFile) ? 16000 : 32000);
ASSERT(stream != NULL);
aStream[nStream] = stream; aStream[nStream] = stream;
@ -1858,8 +1803,53 @@ cSampleManager::StartStreamedFile(uint8 nFile, uint32 nPos, uint8 nStream)
delete stream; delete stream;
aStream[nStream] = NULL; aStream[nStream] = NULL;
} }
return false;
}
}
if(mp3->pLinkPath != NULL)
aStream[nStream] = new CStream(mp3->pLinkPath, ALStreamSources[nStream], ALStreamBuffers[nStream], IsThisTrackAt16KHz(nFile) ? 16000 : 32000);
else {
strcpy(filename, _mp3DirectoryPath);
strcat(filename, mp3->aFilename);
aStream[nStream] = new CStream(filename, ALStreamSources[nStream], ALStreamBuffers[nStream]);
} }
if (aStream[nStream]->Setup()) {
aStream[nStream]->Start();
#ifdef FIX_BUGS
_bIsMp3Active = true;
#endif
return true;
} else {
delete aStream[nStream];
aStream[nStream] = NULL;
}
}
_bIsMp3Active = 0;
}
while ( ++i < nNumMP3s );
position = 0;
nFile = 0;
}
strcpy(filename, StreamedNameTable[nFile]);
CStream *stream = new CStream(filename, ALStreamSources[nStream], ALStreamBuffers[nStream], IsThisTrackAt16KHz(nFile) ? 16000 : 32000);
aStream[nStream] = stream;
if ( stream->Setup() ) {
if (position != 0)
stream->SetPosMS(position);
stream->Start();
return true;
} else {
delete stream;
aStream[nStream] = NULL;
}
return false; return false;
} }