VirtualBox

Changeset 66197 in vbox for trunk/src


Ignore:
Timestamp:
Mar 22, 2017 2:23:28 PM (8 years ago)
Author:
vboxsync
Message:

Storage/CUE: Fixes, convert endianness for audio tracks to big endian

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Storage/CUE.cpp

    r66144 r66197  
    2727#include <VBox/scsiinline.h>
    2828#include <iprt/assert.h>
     29#include <iprt/asm.h>
    2930#include <iprt/alloc.h>
    3031#include <iprt/cdefs.h>
     
    7273    /** BINARY */
    7374    CUEKEYWORD_BINARY,
     75    /** MOTOROLA */
     76    CUEKEYWORD_MOTOROLA,
    7477    /** WAVE */
    7578    CUEKEYWORD_WAVE,
     
    210213    /** Pointer to our internal region list. */
    211214    PVDREGIONLIST       pRegionList;
     215    /** Flag whether the backing file is little (BINARY) or big (MOTOROLA) endian. */
     216    bool                fLittleEndian;
    212217} CUEIMAGE, *PCUEIMAGE;
    213218
     
    10291034            {
    10301035                if (cueTokenizerSkipIfIsKeywordEqual(pTokenizer, CUEKEYWORD_BINARY))
     1036                {
     1037                    pThis->fLittleEndian = true;
    10311038                    rc = cueParseTrackList(pThis, pTokenizer);
     1039                }
     1040                else if (cueTokenizerSkipIfIsKeywordEqual(pTokenizer, CUEKEYWORD_MOTOROLA))
     1041                {
     1042                    pThis->fLittleEndian = false;
     1043                    rc = cueParseTrackList(pThis, pTokenizer);
     1044                }
    10321045                else
    10331046                    rc = vdIfError(pThis->pIfError, VERR_NOT_SUPPORTED, RT_SRC_POS,
     
    11331146        {
    11341147            cTracks++;
    1135             pRegionPrev->cRegionBlocksOrBytes = pRegionPrev->cbBlock * pRegion->offRegion;
     1148            uint64_t cBlocks = pRegion->offRegion - (pRegionPrev->offRegion / pRegionPrev->cbBlock);
     1149            pRegionPrev->cRegionBlocksOrBytes = pRegionPrev->cbBlock * cBlocks;
    11361150            offDisk += pRegionPrev->cRegionBlocksOrBytes;
    11371151
     
    14911505        Assert(!(cbToRead % pRegion->cbBlock));
    14921506
    1493         rc = vdIfIoIntFileReadUser(pThis->pIfIo, pThis->pStorageData, uOffset,
    1494                                    pIoCtx, cbToRead);
    1495         if (RT_SUCCESS(rc))
     1507        /* Need to convert audio data samples to big endian. */
     1508        if (   pRegion->enmDataForm == VDREGIONDATAFORM_CDDA
     1509            && pThis->fLittleEndian)
     1510        {
    14961511            *pcbActuallyRead = cbToRead;
     1512
     1513            while (cbToRead)
     1514            {
     1515                RTSGSEG Segment;
     1516                unsigned cSegments = 1;
     1517                size_t cbSeg = 0;
     1518
     1519                cbSeg = vdIfIoIntIoCtxSegArrayCreate(pThis->pIfIo, pIoCtx, &Segment,
     1520                                                     &cSegments, cbToRead);
     1521
     1522                rc = vdIfIoIntFileReadSync(pThis->pIfIo, pThis->pStorageData, uOffset, Segment.pvSeg, cbSeg);
     1523                if (RT_FAILURE(rc))
     1524                    break;
     1525
     1526                uint16_t *pu16Buf = (uint16_t *)Segment.pvSeg;
     1527                for (uint32_t i = 0; i < cbSeg / sizeof(uint16_t); i++)
     1528                {
     1529                    *pu16Buf = RT_BSWAP_U16(*pu16Buf);
     1530                    pu16Buf++;
     1531                }
     1532
     1533                cbToRead -= RT_MIN(cbToRead, cbSeg);
     1534                uOffset += cbSeg;
     1535            }
     1536        }
     1537        else
     1538        {
     1539            rc = vdIfIoIntFileReadUser(pThis->pIfIo, pThis->pStorageData, uOffset,
     1540                                       pIoCtx, cbToRead);
     1541            if (RT_SUCCESS(rc))
     1542                *pcbActuallyRead = cbToRead;
     1543        }
    14971544    }
    14981545    else
     
    15611608    LogFlowFunc(("pBackendData=%#p\n", pBackendData));
    15621609    PCUEIMAGE pThis = (PCUEIMAGE)pBackendData;
    1563     uint64_t cb = 0;
    15641610
    15651611    AssertPtrReturn(pThis, 0);
     1612
     1613    PCVDREGIONDESC pRegion = &pThis->pRegionList->aRegions[pThis->pRegionList->cRegions - 1];
     1614    uint64_t cb = pRegion->offRegion + pRegion->cRegionBlocksOrBytes;
    15661615
    15671616    LogFlowFunc(("returns %llu\n", cb));
     
    15801629    if (pThis->pStorage)
    15811630    {
    1582         int rc = vdIfIoIntFileGetSize(pThis->pIfIo, pThis->pStorage, &cbFile);
     1631        int rc = vdIfIoIntFileGetSize(pThis->pIfIo, pThis->pStorageData, &cbFile);
    15831632        if (RT_FAILURE(rc))
    15841633            cbFile = 0; /* Make sure it is 0 */
     
    19411990    "CUE",
    19421991    /* uBackendCaps */
    1943     VD_CAP_FILE | VD_CAP_ASYNC | VD_CAP_VFS,
     1992    VD_CAP_FILE | VD_CAP_VFS,
    19441993    /* paFileExtensions */
    19451994    s_aCueFileExtensions,
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette