2015-07-17 5 views
14

में असमर्थ मैं एक AudioFileStream_PacketsProc कॉलबैक एक AudioFileStreamOpen जो AudioConverterFillComplexBuffer का उपयोग कर पीसीएम में ऑडियो पैकेट परिवर्तित हैंडल के दौरान सेट है। मेरे पास जो मुद्दा है वह यह है कि मुझे AudioConverterFillComplexBuffer के बाद -50 ओएसएसटैटस (paramErr) मिल रहा है। नीचे क्या मापदंडों AudioConverterFillComplexBuffer में इस्तेमाल किया गया का एक टुकड़ा है और वे कैसे किए गए:AudioConverterFillComplexBuffer का उपयोग कर पीसीएम में एमपी 3 कन्वर्ट करने के लिए AudioFileStreamOpen के AudioFileStream_PacketsProc कॉलबैक

 audioConverterRef = AudioConverterRef() 

     // AudioConvertInfo is a struct that contains information 
     // for the converter regarding the number of packets and 
     // which audiobuffer is being allocated 
     convertInfo? = AudioConvertInfo(done: false, numberOfPackets: numberPackets, audioBuffer: buffer, 
      packetDescriptions: packetDescriptions) 

     var framesToDecode: UInt32 = pcmBufferTotalFrameCount! - end 

     var localPcmAudioBuffer = AudioBuffer() 
     localPcmAudioBuffer.mData = pcmAudioBuffer!.mData.advancedBy(Int(end * pcmBufferFrameSizeInBytes!)) 

     var localPcmBufferList = AudioBufferList(mNumberBuffers: 1, mBuffers: AudioBuffer(mNumberChannels: 0, mDataByteSize: 0, mData: nil)) 
     localPcmAudioBuffer = localPcmBufferList.mBuffers 
     localPcmAudioBuffer.mData = pcmAudioBuffer!.mData.advancedBy(Int(end * pcmBufferFrameSizeInBytes!)) 
     localPcmAudioBuffer.mDataByteSize = framesToDecode * pcmBufferFrameSizeInBytes!; 
     localPcmAudioBuffer.mNumberChannels = pcmAudioBuffer!.mNumberChannels 

     var localPcmBufferList = AudioBufferList(mNumberBuffers: 1, mBuffers: AudioBuffer(mNumberChannels: 0, mDataByteSize: 0, mData: nil)) 
     localPcmAudioBuffer = localPcmBufferList.mBuffers 

     AudioConverterFillComplexBuffer(audioConverterRef, AudioConverter_Callback, &convertInfo, &framesToDecode, &localPcmBufferList, nil) 

क्या संभवतः परम त्रुटि का कारण हो सकता है? मैं तुम्हारे लिए संभव समाधान के साथ कुछ जवाब

func handleAudioPackets(inputData: UnsafePointer<Void>, numberBytes: UInt32, numberPackets: UInt32, packetDescriptions: UnsafeMutablePointer<AudioStreamPacketDescription>) { 
     if currentlyReadingEntry == nil { 
      print("currentlyReadingEntry = nil") 
      return 
     } 
     if currentlyReadingEntry.parsedHeader == false { 
      print("currentlyReadingEntry.parsedHeader == false") 
      return 
     } 

     if disposedWasRequested == true { 
      print("disposedWasRequested == true") 
      return 
     } 

     guard let audioConverterRef = audioConverterRef else { 
      return 
     } 

     if seekToTimeWasRequested == true && currentlyReadingEntry.calculatedBitRate() > 0.0 { 
      wakeupPlaybackThread() 
      print("seekToTimeWasRequested == true && currentlyReadingEntry.calculatedBitRate() > 0.0") 
      return 
     } 

     discontinuous = false 

     var buffer = AudioBuffer() 
     buffer.mNumberChannels = audioConverterAudioStreamBasicDescription.mChannelsPerFrame 
     buffer.mDataByteSize = numberBytes 
     buffer.mData = UnsafeMutablePointer<Void>(inputData) 


     convertInfo? = AudioConvertInfo(done: false, numberOfPackets: numberPackets, audioBuffer: buffer, 
      packetDescriptions: packetDescriptions) 


     if packetDescriptions != nil && currentlyReadingEntry.processedPacketsCount < maxCompressedBacketsForBitrateCalculation { 
      let count: Int = min(Int(numberPackets), Int(maxCompressedBacketsForBitrateCalculation - currentlyReadingEntry.processedPacketsCount!)) 
      for var i = 0;i < count;++i{ 
       let packetSize: Int32 = Int32(packetDescriptions[i].mDataByteSize) 
       OSAtomicAdd32(packetSize, &currentlyReadingEntry.processedPacketsSizeTotal!) 
       OSAtomicIncrement32(&currentlyReadingEntry.processedPacketsCount!) 
      } 
     } 
     while true { 
      OSSpinLockLock(&pcmBufferSpinLock) 
      var used: UInt32 = pcmBufferUsedFrameCount! 
      var start: UInt32 = pcmBufferFrameStartIndex! 
      var end = (pcmBufferFrameStartIndex! + pcmBufferUsedFrameCount!) % pcmBufferTotalFrameCount! 
      var framesLeftInsideBuffer = pcmBufferTotalFrameCount! - used 
      OSSpinLockUnlock(&pcmBufferSpinLock) 

      if framesLeftInsideBuffer == 0 { 
       pthread_mutex_lock(&playerMutex) 
       while true { 
        OSSpinLockLock(&pcmBufferSpinLock) 
        used = pcmBufferUsedFrameCount! 
        start = pcmBufferFrameStartIndex! 
        end = (pcmBufferFrameStartIndex! + pcmBufferUsedFrameCount!) % pcmBufferTotalFrameCount! 
        framesLeftInsideBuffer = pcmBufferTotalFrameCount! - used 
        OSSpinLockUnlock(&pcmBufferSpinLock) 

        if framesLeftInsideBuffer > 0 { 
         break 
        } 

        if (disposedWasRequested == true 
         || internalState == SSPlayerInternalState.Disposed) { 
         pthread_mutex_unlock(&playerMutex) 
         return 
        } 

        if (seekToTimeWasRequested == true && currentlyPlayingEntry.calculatedBitRate() > 0.0) 
        { 
         pthread_mutex_unlock(&playerMutex) 
         wakeupPlaybackThread() 
         return; 
        } 

        waiting = true 
        pthread_cond_wait(&playerThreadReadyCondition, &playerMutex) 
        waiting = false 
       } 
       pthread_mutex_unlock(&playerMutex) 
      } 
      var localPcmAudioBuffer = AudioBuffer() 
      var localPcmBufferList = AudioBufferList(mNumberBuffers: 1, mBuffers: AudioBuffer(mNumberChannels: 0, mDataByteSize: 0, mData: nil)) 
      localPcmAudioBuffer = localPcmBufferList.mBuffers 

      if end >= start { 
       var framesAdded: UInt32 = 0 
       var framesToDecode: UInt32 = pcmBufferTotalFrameCount! - end 
       localPcmAudioBuffer.mData = pcmAudioBuffer!.mData.advancedBy(Int(end * pcmBufferFrameSizeInBytes!)) 
       localPcmAudioBuffer.mDataByteSize = framesToDecode * pcmBufferFrameSizeInBytes!; 
       localPcmAudioBuffer.mNumberChannels = pcmAudioBuffer!.mNumberChannels 

       AudioConverterFillComplexBuffer(audioConverterRef, AudioConverter_Callback, &convertInfo, &framesToDecode, &localPcmBufferList, nil) 

       framesAdded = framesToDecode 

       if status == 100 { 
        OSSpinLockLock(&pcmBufferSpinLock) 
        let newCount = pcmBufferUsedFrameCount! + framesAdded 
        pcmBufferUsedFrameCount = newCount 
        OSSpinLockUnlock(&pcmBufferSpinLock); 

        OSSpinLockLock(&currentlyReadingEntry!.spinLock!) 
        let newFramesAddedCount = currentlyReadingEntry.framesQueued! + Int64(framesAdded) 
        currentlyReadingEntry!.framesQueued! = newFramesAddedCount 
        OSSpinLockUnlock(&currentlyReadingEntry!.spinLock!) 
        return 
       } else if status != 0 { 
        print("error") 
        return 
       } 
       framesToDecode = start 

       if framesToDecode == 0 { 

        OSSpinLockLock(&pcmBufferSpinLock) 
        let newCount = pcmBufferUsedFrameCount! + framesAdded 
        pcmBufferUsedFrameCount = newCount 
        OSSpinLockUnlock(&pcmBufferSpinLock); 

        OSSpinLockLock(&currentlyReadingEntry!.spinLock!) 
        let newFramesAddedCount = currentlyReadingEntry.framesQueued! + Int64(framesAdded) 
        currentlyReadingEntry!.framesQueued! = newFramesAddedCount 
        OSSpinLockUnlock(&currentlyReadingEntry!.spinLock!) 
        continue 
       } 

       localPcmAudioBuffer.mData = pcmAudioBuffer!.mData 
       localPcmAudioBuffer.mDataByteSize = framesToDecode * pcmBufferFrameSizeInBytes! 
       localPcmAudioBuffer.mNumberChannels = pcmAudioBuffer!.mNumberChannels 

       AudioConverterFillComplexBuffer(audioConverterRef, AudioConverter_Callback, &convertInfo, &framesToDecode, &localPcmBufferList, nil) 
       let decodedFramesAdded = framesAdded + framesToDecode 
       framesAdded = decodedFramesAdded 

       if status == 100 { 
        OSSpinLockLock(&pcmBufferSpinLock) 
        let newCount = pcmBufferUsedFrameCount! + framesAdded 
        pcmBufferUsedFrameCount = newCount 
        OSSpinLockUnlock(&pcmBufferSpinLock); 

        OSSpinLockLock(&currentlyReadingEntry!.spinLock!) 
        let newFramesAddedCount = currentlyReadingEntry.framesQueued! + Int64(framesAdded) 
        currentlyReadingEntry!.framesQueued! = newFramesAddedCount 
        OSSpinLockUnlock(&currentlyReadingEntry!.spinLock!) 
        return 
       } else if status == 0 { 
        OSSpinLockLock(&pcmBufferSpinLock) 
        let newCount = pcmBufferUsedFrameCount! + framesAdded 
        pcmBufferUsedFrameCount = newCount 
        OSSpinLockUnlock(&pcmBufferSpinLock); 

        OSSpinLockLock(&currentlyReadingEntry!.spinLock!) 
        let newFramesAddedCount = currentlyReadingEntry.framesQueued! + Int64(framesAdded) 
        currentlyReadingEntry!.framesQueued! = newFramesAddedCount 
        OSSpinLockUnlock(&currentlyReadingEntry!.spinLock!) 
        continue 
       } else if status != 0 { 
        print("error") 
        return 
       } else { 
        var framesAdded: UInt32 = 0 
        var framesToDecode: UInt32 = start - end 
        localPcmAudioBuffer.mData = pcmAudioBuffer!.mData.advancedBy(Int(end * pcmBufferFrameSizeInBytes!)) 
        localPcmAudioBuffer.mDataByteSize = framesToDecode * pcmBufferFrameSizeInBytes!; 
        localPcmAudioBuffer.mNumberChannels = pcmAudioBuffer!.mNumberChannels 

        var convertInfoo: UnsafePointer<Void> = unsafeBitCast(convertInfo, UnsafePointer<Void>.self) 

        status = AudioConverterFillComplexBuffer(audioConverterRef, AudioConverter_Callback, &convertInfoo, &framesToDecode, &localPcmBufferList, nil) 

        framesAdded = framesToDecode 

        if status == 100 { 
         OSSpinLockLock(&pcmBufferSpinLock) 
         let newCount = pcmBufferUsedFrameCount! + framesAdded 
         pcmBufferUsedFrameCount = newCount 
         OSSpinLockUnlock(&pcmBufferSpinLock); 

         OSSpinLockLock(&currentlyReadingEntry!.spinLock!) 
         let newFramesAddedCount = currentlyReadingEntry.framesQueued! + Int64(framesAdded) 
         currentlyReadingEntry!.framesQueued! = newFramesAddedCount 
         OSSpinLockUnlock(&currentlyReadingEntry!.spinLock!) 
         return 
        } else if status == 0 { 
         OSSpinLockLock(&pcmBufferSpinLock) 
         let newCount = pcmBufferUsedFrameCount! + framesAdded 
         pcmBufferUsedFrameCount = newCount 
         OSSpinLockUnlock(&pcmBufferSpinLock); 

         OSSpinLockLock(&currentlyReadingEntry!.spinLock!) 
         let newFramesAddedCount = currentlyReadingEntry.framesQueued! + Int64(framesAdded) 
         currentlyReadingEntry!.framesQueued! = newFramesAddedCount 
         OSSpinLockUnlock(&currentlyReadingEntry!.spinLock!) 
         continue 
        } else if status != 0 { 
         print("error") 
         return 
        } 

       } 
      } 
     } 
    } 
+0

आप एक runnable परियोजना के लिए एक लिंक है, GitHub में कहते हैं? –

उत्तर

5

Hej @ 3,254,523,:

यहाँ कॉलबैक के लिए पूर्ण विधि अगर जरूरत है। मैं आपको इस प्रमुख में विशेषज्ञ नहीं होने के बावजूद आपको सही तरीके से मार्गदर्शन करने की आशा करता हूं। , http://lists.apple.com/archives/coreaudio-api/2012/Apr/msg00041.html https://forums.developer.apple.com/thread/6313

अब हम:

AudioBufferList 

यहाँ लिंक है कि इस -50 OSStatusAudioBufferList से संबंधित के संकेत को जांचता है: तो, समस्या के विन्यास निश्चित है एक समाधान में ध्यान केंद्रित करना है। अपने AudioBufferList के माध्यम से देख रहे हैं, तो आप कोई किसी भी मूल्य लेकिन mNumberBuffers जो है 1. (के रूप में यह दूसरी कड़ी में दिखाया गया है) निम्नलिखित तरीके से मूल्यों को बदलने की कोशिश सौंपा है:

var localPcmBufferList = AudioBufferList(mNumberBuffers: 2, mBuffers: AudioBuffer(mNumberChannels: 2, mDataByteSize: UInt32(buffer.count), mData: &buffer)) 

तो अब भी है

01: काम नहीं कर रहा है, हम इसलिए यहां आप में -50 OSStatus का हल AudioConverterFillComplexBuffer तेज में हालांकि नहीं मिल सकता है यह ठीक से सही करने के लिए ध्यान केंद्रित करने की है,

iPhone: AudioBufferList init and release

+0

क्या यह आपके लिए उपयोगी था @ 3254523 ??? – juanmajmjr

+0

अभी भी इसे @juanmajmjr – 3254523

+0

पर आज़माकर मुझे 1768846202 (इनपुट त्रुटि) मिल रहा है कि मैंने mNumberBuffers को '1' के रूप में रखा है। वह क्या हो सकता है? – 3254523

संबंधित मुद्दे

 संबंधित मुद्दे