Beispiel #1
0
int File::read(char* buffer, int max)
{
	int i;
	for(i = 0; i < max && !isEndOfFile(); i++)
		readChar(buffer + i);
	return i;
}
Beispiel #2
0
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;
		}	
	}
}
Beispiel #3
0
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;
		}
	}
}
Beispiel #4
0
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();
} 
Beispiel #5
0
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;
}