Esempio n. 1
0
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);
    }
}
Esempio n. 2
0
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;
}
Esempio n. 3
0
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;
}
Esempio n. 4
0
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;
}
Esempio n. 5
0
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 });
    }
}