VirtualBox

Changeset 63927 in vbox for trunk/src/VBox/Devices


Ignore:
Timestamp:
Sep 21, 2016 3:26:08 PM (8 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
110811
Message:

Audio/DrvHostCoreAudio.cpp: Update on Audio Queues (work in progress, not yet enabled by default).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Audio/DrvHostCoreAudio.cpp

    r63922 r63927  
    18801880        return VERR_GENERAL_FAILURE; /** @todo Fudge! */
    18811881
     1882    /* Signal the main thread. */
     1883    RTThreadUserSignal(RTThreadSelf());
     1884
    18821885    /*
    1883      * Start the queue.
     1886     * Enter the main loop.
    18841887     */
    1885     err = AudioQueueStart(pCAStream->audioQueue, NULL);
    1886 
    1887     RTThreadUserSignal(RTThreadSelf());
    1888 
    18891888    const bool fIn = pCAStream->enmDir == PDMAUDIODIR_IN;
    18901889
     
    18941893    }
    18951894
     1895    /*
     1896     * Cleanup.
     1897     */
    18961898    if (fIn)
    18971899    {
     
    19191921                                  UInt32 cPacketDesc, const AudioStreamPacketDescription *paPacketDesc)
    19201922{
    1921     RT_NOREF(pAudioTS, cPacketDesc, paPacketDesc);
     1923    RT_NOREF(audioQueue, pAudioTS, cPacketDesc, paPacketDesc);
    19221924
    19231925    PCOREAUDIOSTREAM pCAStream = (PCOREAUDIOSTREAM)pvUser;
     
    19471949            RTCircBufAcquireWriteBlock(pCircBuf, cbLeft, (void **)&pvDst, &cbToWrite);
    19481950
     1951            if (!cbToWrite)
     1952                break;
     1953
    19491954            /* Copy the data from our ring buffer to the core audio buffer. */
    19501955            memcpy((UInt8 *)pvDst + cbWritten, pvSrc + cbWritten, cbToWrite);
    19511956
    19521957            /* Release the read buffer, so it could be used for new data. */
    1953             RTCircBufReleaseReadBlock(pCircBuf, cbToWrite);
     1958            RTCircBufReleaseWriteBlock(pCircBuf, cbToWrite);
    19541959
    19551960            cbWritten += cbToWrite;
     
    19601965    }
    19611966
    1962     if (cbWritten)
    1963     {
    1964         OSStatus err = AudioQueueEnqueueBuffer(audioQueue, audioBuffer, 0, NULL);
    1965         if (err != noErr)
    1966             LogFunc(("Failed writing %zu bytes\n", cbWritten));
    1967     }
    1968 
    1969     LogFunc(("pCAStream=%p, fRunning=%RTbool, cbWritten=%zu\n", pCAStream, fRunning, cbWritten));
    1970 
    19711967    rc = RTCritSectLeave(&pCAStream->CritSect);
    19721968    AssertRC(rc);
     1969
     1970    audioBuffer->mAudioDataByteSize = cbWritten;
     1971
     1972    AudioQueueEnqueueBuffer(pCAStream->audioQueue, audioBuffer, 0, NULL);
     1973
     1974    Log3Func(("pCAStream=%p, fRunning=%RTbool, cbWritten=%zu\n", pCAStream, fRunning, cbWritten));
    19731975}
    19741976
    19751977static void coreAudioOutputQueueCb(void *pvUser, AudioQueueRef audioQueue, AudioQueueBufferRef audioBuffer)
    19761978{
     1979    RT_NOREF(audioQueue);
     1980
    19771981    PCOREAUDIOSTREAM pCAStream = (PCOREAUDIOSTREAM)pvUser;
    19781982    AssertPtr(pCAStream);
     
    20302034    }
    20312035
    2032     AudioQueueEnqueueBuffer(audioQueue, audioBuffer, 0, NULL);
    2033 
    2034     LogFunc(("pCAStream=%p, fRunning=%RTbool, cbCapacity=%RU32, cbRead=%zu\n",
    2035              pCAStream, fRunning, audioBuffer->mAudioDataBytesCapacity, cbRead));
     2036    AudioQueueEnqueueBuffer(pCAStream->audioQueue, audioBuffer, 0, NULL);
     2037
     2038    Log3Func(("pCAStream=%p, fRunning=%RTbool, cbCapacity=%RU32, cbRead=%zu\n",
     2039              pCAStream, fRunning, audioBuffer->mAudioDataBytesCapacity, cbRead));
    20362040
    20372041    rc = RTCritSectLeave(&pCAStream->CritSect);
     
    20642068                       : "Playback queue format", &pCAStream->asbdAcq);
    20652069
    2066     rc = RTCircBufCreate(&pCAStream->pCircBuf, 4096 << 1 /*pHstStrmIn->Props.cShift*/); /** @todo FIX THIS !!! */
     2070    rc = RTCircBufCreate(&pCAStream->pCircBuf, 8096 << 1 /*pHstStrmIn->Props.cShift*/); /** @todo FIX THIS !!! */
    20672071    if (RT_FAILURE(rc))
    20682072        return rc;
     
    31283132    uint32_t cbWrittenTotal = 0;
    31293133
     3134#ifdef VBOX_WITH_AUDIO_CA_QUEUES
     3135    rc = RTCritSectEnter(&pCAStream->CritSect);
     3136    AssertRC(rc);
     3137#endif
     3138
    31303139    do
    31313140    {
     
    31353144        uint32_t cWritten, cbWritten;
    31363145        uint8_t *puBuf;
    3137         size_t   cbToRead;
     3146        size_t   cbToRead = 0;
    31383147
    31393148        Log3Func(("cbMixBuf=%zu, cbToWrite=%zu/%zu\n", cbMixBuf, cbToWrite, RTCircBufSize(pCAStream->pCircBuf)));
     
    31443153            RTCircBufAcquireReadBlock(pCAStream->pCircBuf, cbToWrite, (void **)&puBuf, &cbToRead);
    31453154            if (!cbToRead)
    3146             {
    3147                 RTCircBufReleaseReadBlock(pCAStream->pCircBuf, cbToRead);
    31483155                break;
    3149             }
    31503156
    31513157#ifdef DEBUG_DUMP_PCM_DATA
     
    31693175                || !cWritten)
    31703176            {
    3171                 RTCircBufReleaseReadBlock(pCAStream->pCircBuf, cbToRead);
    31723177                break;
    31733178            }
     
    31833188    }
    31843189    while (0);
     3190
     3191#ifdef VBOX_WITH_AUDIO_CA_QUEUES
     3192    int rc2 = RTCritSectLeave(&pCAStream->CritSect);
     3193    AssertRC(rc2);
     3194#endif
    31853195
    31863196    if (RT_SUCCESS(rc))
     
    33403350            LogFunc(("Queue enable/resume\n"));
    33413351            ASMAtomicXchgBool(&pCAStream->fRunning, true);
     3352
     3353            AudioQueueStart(pCAStream->audioQueue, NULL);
    33423354#else
    33433355            /* Only start the device if it is actually stopped */
     
    33703382            LogFunc(("Queue disable/pause\n"));
    33713383            ASMAtomicXchgBool(&pCAStream->fRunning, false);
     3384
     3385            AudioQueuePause(pCAStream->audioQueue);
    33723386#else
    33733387            /* Only stop the device if it is actually running */
     
    35593573
    35603574            rc = coreAudioStreamInitQueue(pCAStream, pCfgReq, pCfgAcq);
     3575
     3576            pCfgAcq->cSampleBufferSize = _4K; /** @todo FIX THIS !!! */
    35613577#else
    35623578            if (fIn)
Note: See TracChangeset for help on using the changeset viewer.

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