src/multimedia/audio/qaudioinput_mac_p.cpp
changeset 33 3e2da88830cd
parent 19 fcece45ef507
equal deleted inserted replaced
30:5dc02b23752f 33:3e2da88830cd
   206         dst.mBuffers[0].mData = audioBufferList->data() + (position * audioBufferList->packetSize());
   206         dst.mBuffers[0].mData = audioBufferList->data() + (position * audioBufferList->packetSize());
   207 
   207 
   208         position += packetCount;
   208         position += packetCount;
   209 
   209 
   210         return true;
   210         return true;
       
   211     }
       
   212 
       
   213     bool empty() const
       
   214     {
       
   215         return position == totalPackets;
   211     }
   216     }
   212 
   217 
   213 private:
   218 private:
   214     UInt32 totalPackets;
   219     UInt32 totalPackets;
   215     UInt32 position;
   220     UInt32 position;
   257                              AudioUnitRenderActionFlags* ioActionFlags,
   262                              AudioUnitRenderActionFlags* ioActionFlags,
   258                              const AudioTimeStamp* inTimeStamp,
   263                              const AudioTimeStamp* inTimeStamp,
   259                              UInt32 inBusNumber,
   264                              UInt32 inBusNumber,
   260                              UInt32 inNumberFrames)
   265                              UInt32 inNumberFrames)
   261     {
   266     {
   262         const bool  wasEmpty = m_buffer->used() == 0;
   267         const bool  pullMode = m_device == 0;
   263 
   268 
   264         OSStatus    err;
   269         OSStatus    err;
   265         qint64      framesRendered = 0;
   270         qint64      framesRendered = 0;
   266 
   271 
   267         m_inputBufferList->reset();
   272         m_inputBufferList->reset();
   273                                 m_inputBufferList->audioBufferList());
   278                                 m_inputBufferList->audioBufferList());
   274 
   279 
   275         if (m_audioConverter != 0) {
   280         if (m_audioConverter != 0) {
   276             QAudioPacketFeeder  feeder(m_inputBufferList);
   281             QAudioPacketFeeder  feeder(m_inputBufferList);
   277 
   282 
   278             bool    wecan = true;
       
   279             int     copied = 0;
   283             int     copied = 0;
   280 
       
   281             const int available = m_buffer->free();
   284             const int available = m_buffer->free();
   282 
   285 
   283             while (err == noErr && wecan) {
   286             while (err == noErr && !feeder.empty()) {
   284                 QAudioRingBuffer::Region region = m_buffer->acquireWriteRegion(available);
   287                 QAudioRingBuffer::Region region = m_buffer->acquireWriteRegion(available);
   285 
   288 
   286                 if (region.second > 0) {
   289                 if (region.second == 0)
   287                     AudioBufferList     output;
   290                     break;
   288                     output.mNumberBuffers = 1;
   291 
   289                     output.mBuffers[0].mNumberChannels = 1;
   292                 AudioBufferList     output;
   290                     output.mBuffers[0].mDataByteSize = region.second;
   293                 output.mNumberBuffers = 1;
   291                     output.mBuffers[0].mData = region.first;
   294                 output.mBuffers[0].mNumberChannels = 1;
   292 
   295                 output.mBuffers[0].mDataByteSize = region.second;
   293                     UInt32  packetSize = region.second / m_outputFormat.mBytesPerPacket;
   296                 output.mBuffers[0].mData = region.first;
   294                     err = AudioConverterFillComplexBuffer(m_audioConverter,
   297 
   295                                                           converterCallback,
   298                 UInt32  packetSize = region.second / m_outputFormat.mBytesPerPacket;
   296                                                           &feeder,
   299                 err = AudioConverterFillComplexBuffer(m_audioConverter,
   297                                                           &packetSize,
   300                                                       converterCallback,
   298                                                           &output,
   301                                                       &feeder,
   299                                                           0);
   302                                                       &packetSize,
   300 
   303                                                       &output,
   301                     region.second = output.mBuffers[0].mDataByteSize;
   304                                                       0);
   302                     copied += region.second;
   305                 region.second = output.mBuffers[0].mDataByteSize;
   303 
   306                 copied += region.second;
   304                     m_buffer->releaseWriteRegion(region);
   307 
   305                 }
   308                 m_buffer->releaseWriteRegion(region);
   306                 else
       
   307                     wecan = false;
       
   308             }
   309             }
   309 
   310 
   310             framesRendered += copied / m_outputFormat.mBytesPerFrame;
   311             framesRendered += copied / m_outputFormat.mBytesPerFrame;
   311         }
   312         }
   312         else {
   313         else {
   328             }
   329             }
   329 
   330 
   330             framesRendered = copied / m_outputFormat.mBytesPerFrame;
   331             framesRendered = copied / m_outputFormat.mBytesPerFrame;
   331         }
   332         }
   332 
   333 
   333         if (wasEmpty && framesRendered > 0)
   334         if (pullMode && framesRendered > 0)
   334             emit readyRead();
   335             emit readyRead();
   335 
   336 
   336         return framesRendered;
   337         return framesRendered;
   337     }
   338     }
   338 
   339