gl::Error Blit9::copy(IDirect3DSurface9 *source, const RECT &sourceRect, GLenum destFormat, const gl::Offset &destOffset, IDirect3DSurface9 *dest) { ASSERT(source != NULL && dest != NULL); IDirect3DDevice9 *device = mRenderer->getDevice(); D3DSURFACE_DESC sourceDesc; D3DSURFACE_DESC destDesc; source->GetDesc(&sourceDesc); dest->GetDesc(&destDesc); if (sourceDesc.Format == destDesc.Format && destDesc.Usage & D3DUSAGE_RENDERTARGET && d3d9_gl::IsFormatChannelEquivalent(destDesc.Format, destFormat)) // Can use StretchRect { RECT destRect = { destOffset.x, destOffset.y, destOffset.x + (sourceRect.right - sourceRect.left), destOffset.y + (sourceRect.bottom - sourceRect.top)}; HRESULT result = device->StretchRect(source, &sourceRect, dest, &destRect, D3DTEXF_POINT); if (FAILED(result)) { ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY); return gl::Error(GL_OUT_OF_MEMORY, "Failed to blit between textures, StretchRect result: 0x%X.", result); } return gl::Error(GL_NO_ERROR); } else { return formatConvert(source, sourceRect, destFormat, destOffset, dest); } }
IAudioFile::FormatText& AudioFileSndfile::formatText( const IAudioFile::Format& format) { _formatText.reset(new FormatText()); int sfFormat = formatConvert(format); SF_FORMAT_INFO fi; fi.format = sfFormat & SF_FORMAT_TYPEMASK; int error = sf_command(NULL, SFC_GET_FORMAT_INFO, &fi, sizeof fi); if (error) { SNDFILE_ERROR(error, "Can't get major format info"); } _formatText->majorText = fi.name; fi.format = sfFormat & SF_FORMAT_SUBMASK; error = sf_command(NULL, SFC_GET_FORMAT_INFO, &fi, sizeof fi); if (error) { SNDFILE_ERROR(error, "Can't get minor format info"); } _formatText->minorText = fi.name; return *_formatText; }
const IAudioFile::SimpleFormats& AudioFileSndfile::formats() { if (!_simpleFormats) { _simpleFormats = std::make_shared<SimpleFormats>(); sf_command(nullptr, SFC_GET_SIMPLE_FORMAT_COUNT, &_simpleFormats->count, sizeof _simpleFormats->count); _simpleFormatsData.clear(); SF_FORMAT_INFO fi; for (unsigned i = 0; i < _simpleFormats->count; i++) { fi.format = int(i); int error = sf_command(NULL, SFC_GET_SIMPLE_FORMAT, &fi, sizeof fi); if (error) { SNDFILE_ERROR(error, "Can't get simple format info"); } SimpleFormats::Formats sff; sff.description = fi.name; sff.extension = fi.extension; sff.format = formatConvert(fi.format); _simpleFormatsData.push_back(sff); } _simpleFormats->formats = _simpleFormatsData.data(); } return *_simpleFormats; }
bool Blit::copy(IDirect3DSurface9 *source, const RECT &sourceRect, GLenum destFormat, GLint xoffset, GLint yoffset, IDirect3DSurface9 *dest) { IDirect3DDevice9 *device = getDevice(); D3DSURFACE_DESC sourceDesc; D3DSURFACE_DESC destDesc; source->GetDesc(&sourceDesc); dest->GetDesc(&destDesc); if (sourceDesc.Format == destDesc.Format && destDesc.Usage & D3DUSAGE_RENDERTARGET && dx2es::IsFormatChannelEquivalent(destDesc.Format, destFormat)) // Can use StretchRect { RECT destRect = {xoffset, yoffset, xoffset + (sourceRect.right - sourceRect.left), yoffset + (sourceRect.bottom - sourceRect.top)}; HRESULT result = device->StretchRect(source, &sourceRect, dest, &destRect, D3DTEXF_POINT); if (FAILED(result)) { ASSERT(result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY); return error(GL_OUT_OF_MEMORY, false); } } else { return formatConvert(source, sourceRect, destFormat, xoffset, yoffset, dest); } return true; }
void AudioFileSndfile::open(const char* filename, IAudioFile::Mode mode) { _mode = mode; _path = filename; if (ModeClosed == mode) { return; } static int sfmode[ModeCount] = { 0, SFM_READ, SFM_WRITE, SFM_RDWR, }; SF_INFO sfinfo; sfinfo.channels = int(_info.channels); sfinfo.format = formatConvert(_info.format); LOG(DEBUG, "File format before opening: " << sfinfo.format); sfinfo.frames = _info.frames; sfinfo.samplerate = int(_info.sampleRate); sfinfo.seekable = true; sfinfo.sections = 0; auto psndfile = sf_open(filename, sfmode[mode], &sfinfo); auto deleter = [](SNDFILE* handle) { sf_close(handle); }; _handle = std::shared_ptr<SNDFILE>(psndfile, deleter); if (!_handle) { int errorNumber = sf_error(NULL); SNDFILE_ERROR(errorNumber, "Error opening file handle"); } _mode = mode; if (_mode == ModeWrite) { return; } _info.channels = unsigned(sfinfo.channels); _info.frames = unsigned(sfinfo.frames); _info.sampleRate = unsigned(sfinfo.samplerate); _info.seekable = bool(sfinfo.seekable); _info.format = formatConvert(sfinfo.format); switch (int(_info.format.minor)) { case MinorDPCM_8: case MinorPCM_S8: case MinorPCM_U8: _info.sampleType = Sound::Type::Int8; break; case MinorALAC_20: case MinorALAC_24: case MinorDWVW_24: case MinorPCM_24: // 24 bit case MinorALAC_32: case MinorPCM_32: _info.sampleType = Sound::Type::Int32; break; case MinorDWVW_N: case MinorFloat: case MinorVorbis: // TODO: move following subformats to AudioFileMPG123 case MinorMPEG1_0_DualChannel: case MinorMPEG1_0_JointStereo: case MinorMPEG1_0_Mono: case MinorMPEG1_0_Stereo: case MinorMPEG2_0_DualChannel: case MinorMPEG2_0_JointStereo: case MinorMPEG2_0_Mono: case MinorMPEG2_0_Stereo: case MinorMPEG2_5_DualChannel: case MinorMPEG2_5_JointStereo: case MinorMPEG2_5_Mono: case MinorMPEG2_5_Stereo: _info.sampleType = Sound::Type::Float32; break; case MinorDouble: _info.sampleType = Sound::Type::Float64; break; default: _info.sampleType = Sound::Type::Int16; } // unknown chunks SF_CHUNK_ITERATOR* it = sf_get_chunk_iterator(_handle.get(), NULL); SF_CHUNK_INFO sfci; memset(&sfci, 0, sizeof sfci); _rawChunksData.clear(); while (it) { int errorNumber = sf_get_chunk_data(it, &sfci); if (errorNumber) { SNDFILE_ERROR(errorNumber, "Error reading chunk data"); } std::string id(sfci.id, sfci.id_size); std::vector<ChunkData> data; data.assign(reinterpret_cast<ChunkData*>(sfci.data), reinterpret_cast<ChunkData*>(sfci.data) + sfci.datalen); _rawChunksData.push_back({ id, data }); } }