void RobotDecoder::open(const GuiResourceId robotId, const reg_t plane, const int16 priority, const int16 x, const int16 y, const int16 scale) { if (_status != kRobotStatusUninitialized) { close(); } initStream(robotId); _version = _stream->readUint16(); // TODO: Version 4 for PQ:SWAT demo? if (_version < 5 || _version > 6) { error("Unsupported version %d of Robot resource", _version); } debugC(kDebugLevelVideo, "Opening version %d robot %d", _version, robotId); initPlayback(); _audioBlockSize = _stream->readUint16(); _primerZeroCompressFlag = _stream->readSint16(); _stream->seek(2, SEEK_CUR); // unused _numFramesTotal = _stream->readUint16(); const uint16 paletteSize = _stream->readUint16(); _primerReservedSize = _stream->readUint16(); _xResolution = _stream->readSint16(); _yResolution = _stream->readSint16(); const bool hasPalette = (bool)_stream->readByte(); _hasAudio = (bool)_stream->readByte(); _stream->seek(2, SEEK_CUR); // unused _frameRate = _normalFrameRate = _stream->readSint16(); _isHiRes = (bool)_stream->readSint16(); _maxSkippablePackets = _stream->readSint16(); _maxCelsPerFrame = _stream->readSint16(); // used for memory preallocation of fixed cels _maxCelArea.push_back(_stream->readSint32()); _maxCelArea.push_back(_stream->readSint32()); _maxCelArea.push_back(_stream->readSint32()); _maxCelArea.push_back(_stream->readSint32()); _stream->seek(8, SEEK_CUR); // reserved if (_hasAudio) { initAudio(); } else { _stream->seek(_primerReservedSize, SEEK_CUR); } _priority = priority; initVideo(x, y, scale, plane, hasPalette, paletteSize); initRecordAndCuePositions(); }
/** * Initialize the OpenSL inputs and outputs for this stream. */ HowieError StreamImpl::init(SLEngineItf engineItf, SLObjectItf outputMixObject, const HowieStreamCreationParams &creationParams_) { HOWIE_TRACE_FN(HOWIE_TRACE_LEVEL_CALLS) SLresult result; // Compute the buffer quantum bufferQuantum_ = deviceCharacteristics.framesPerPeriod * deviceCharacteristics.bytesPerSample * deviceCharacteristics.samplesPerFrame; // configure the audio source (supply data through a buffer queue in PCM format) SLDataFormat_PCM format_pcm; // source format format_pcm.formatType = SL_DATAFORMAT_PCM; format_pcm.numChannels = deviceCharacteristics.channelCount; format_pcm.samplesPerSec = (SLuint32) deviceCharacteristics.sampleRate * 1000; format_pcm.bitsPerSample = deviceCharacteristics.bitsPerSample; format_pcm.containerSize = deviceCharacteristics.bitsPerSample * deviceCharacteristics.samplesPerFrame; format_pcm.channelMask = (format_pcm.numChannels == 1) ? SL_SPEAKER_FRONT_CENTER : SL_SPEAKER_FRONT_LEFT | SL_SPEAKER_FRONT_RIGHT; format_pcm.endianness = SL_BYTEORDER_LITTLEENDIAN; if (direction_ & HOWIE_STREAM_DIRECTION_RECORD) { HOWIE_CHECK(initRecording(engineItf, format_pcm)); } if (direction_ & HOWIE_STREAM_DIRECTION_PLAYBACK) { HOWIE_CHECK(initPlayback(engineItf, outputMixObject, format_pcm)); } if (creationParams_.initialState == HOWIE_STREAM_STATE_PLAYING) { run(); } }