int File::read(char* buffer, int max) { int i; for(i = 0; i < max && !isEndOfFile(); i++) readChar(buffer + i); return i; }
void FlcPlayer::decodeAudio(int frames) { int audioFramesFound = 0; while (audioFramesFound < frames && !isEndOfFile(_audioFrameData)) { if (!isValidFrame(_audioFrameData, _audioFrameSize, _audioFrameType)) { _playingState = FINISHED; break; } switch (_audioFrameType) { case FRAME_TYPE: case PREFIX_CHUNK: _audioFrameData += _audioFrameSize; break; case AUDIO_CHUNK: Uint16 sampleRate; readU16(sampleRate, _audioFrameData + 8); _chunkData = _audioFrameData + 16; playAudioFrame(sampleRate); _audioFrameData += _audioFrameSize + 16; ++audioFramesFound; break; } } }
void FlcPlayer::decodeVideo(bool skipLastFrame) { bool videoFrameFound = false; while (!videoFrameFound) { if (!isValidFrame(_videoFrameData, _videoFrameSize, _videoFrameType)) { _playingState = FINISHED; break; } switch (_videoFrameType) { case FRAME_TYPE: Uint32 delay; readU16(_frameChunks, _videoFrameData + 6); readU16(_delayOverride, _videoFrameData + 8); if (_headerType == FLI_TYPE) { delay = _delayOverride > 0 ? _delayOverride : _headerSpeed * (1000.0 / 70.0); } else { delay = _videoDelay; } waitForNextFrame(delay); // Skip the frame header, we are not interested in the rest _chunkData = _videoFrameData + 16; _videoFrameData += _videoFrameSize; // If this frame is the last one, don't play it if(isEndOfFile(_videoFrameData)) _playingState = FINISHED; if(!shouldQuit() || !skipLastFrame) playVideoFrame(); videoFrameFound = true; break; case AUDIO_CHUNK: _videoFrameData += _videoFrameSize + 16; break; case PREFIX_CHUNK: // Just skip it _videoFrameData += _videoFrameSize; break; } } }
void FlcPlayer::waitForNextFrame(Uint32 delay) { static Uint32 oldTick = 0; int newTick; int currentTick; currentTick = SDL_GetTicks(); if (oldTick == 0) { oldTick = currentTick; newTick = oldTick; } else newTick = oldTick + delay; if (_hasAudio) { while (currentTick < newTick) { while ((newTick - currentTick) > 10 && !isEndOfFile(_audioFrameData)) { decodeAudio(1); currentTick = SDL_GetTicks(); } SDL_Delay(1); currentTick = SDL_GetTicks(); } } else { while (currentTick < newTick) { SDL_Delay(1); currentTick = SDL_GetTicks(); } } oldTick = SDL_GetTicks(); }
string Lexer::GetNextWord() { string stringBuffer = ""; bool readingDigitOrChar = false; bool readingSymbols = false; char ch = buffer[lexemeBegin]; if (ch == '\n') { line++; } if (isDigitOrChar(ch)) { readingDigitOrChar = true; } else { readingSymbols = true; } while (ch != EOF) { if (isEndOfFile(ch)) { break; } if (isSpecialCharacter(ch) && (stringBuffer.length() == 0)) { stringBuffer.push_back(ch); break; } if (isEmptyCharacter(ch)) { if (stringBuffer.length() != 0) { break; } } if (isDigitOrChar(ch) && readingDigitOrChar) { stringBuffer.push_back(ch); } else if (!isDigitOrChar(ch) && readingSymbols) { stringBuffer.push_back(ch); } else { if (lexemeBegin > 0) { lexemeBegin--; forward--; } char returnedChar = buffer[forward]; if (returnedChar == '\n') { line--; } break; } lexemeBegin = forward; forward++; ch = buffer[lexemeBegin]; if (ch == '\n') { line++; } } return stringBuffer; }