पर पीसीएम डेटा चलाने के लिए ऑडियो कतार सेवाओं का उपयोग करना मैं आईफोन के लिए एक दूरस्थ डेस्कटॉप क्लाइंट लिख रहा हूं और मैं ऑडियो पुनर्निर्देशन को लागू करने की कोशिश कर रहा हूं।
क्लाइंट सॉकेट कनेक्शन पर सर्वर से कनेक्ट है, और सर्वर एक समय में पीसीएम डेटा के 32K भाग भेजता है।सॉकेट कनेक्शन
मैं डेटा खेलने के लिए एक्यूएस का उपयोग करने की कोशिश कर रहा हूं और यह पहले दो सेकंड (1 बफर लायक) खेलता है। हालांकि, चूंकि डेटा का अगला हिस्सा अभी तक सॉकेट में नहीं आया है, तो अगला ऑडियो क्यूई बफर खाली है। जब डेटा आता है, तो मैं डेटा के साथ अगले उपलब्ध बफर भरता हूं और इसे ऑडियो क्यूईएन्यूक्यूफफर के साथ संलग्न करता हूं। हालांकि, यह कभी भी इन बफर को नहीं चलाता है।
क्या कतार में कोई बफर नहीं होने पर कतार खेलना बंद कर देता है, भले ही आप बाद में बफर जोड़ते हैं?
यहाँ कोड के प्रासंगिक हिस्सा है:
void
wave_out_write(STREAM s, uint16 tick, uint8 index)
{
if(items_in_queue == NUM_BUFFERS){
return;
}
if(!playState.busy){
OSStatus status;
status = AudioQueueNewOutput(&playState.dataFormat, AudioOutputCallback, &playState, CFRunLoopGetCurrent(), NULL, 0, &playState.queue);
if(status == 0){
for(int i=0; i<NUM_BUFFERS; i++){
AudioQueueAllocateBuffer(playState.queue, 40000, &playState.buffers[i]);
}
AudioQueueAddPropertyListener(playState.queue, kAudioQueueProperty_IsRunning, MyAudioQueuePropertyListenerProc, &playState);
status = AudioQueueStart(playState.queue, NULL);
if(status ==0){
playState.busy = True;
}
else{
return;
}
}
else{
return;
}
}
playState.buffers[queue_hi]->mAudioDataByteSize = s->size;
memcpy(playState.buffers[queue_hi]->mAudioData, s->data, s->size);
AudioQueueEnqueueBuffer(playState.queue, playState.buffers[queue_hi], 0, 0);
queue_hi++;
queue_hi = queue_hi % NUM_BUFFERS;
items_in_queue++;
}
void AudioOutputCallback(void* inUserData, AudioQueueRef outAQ, AudioQueueBufferRef outBuffer)
{
PlayState *playState = (PlayState *)inUserData;
items_in_queue--;
}
धन्यवाद!
आपको चुप्पी के साथ कुछ भी पैड नहीं करना है। यदि आपके कॉलबैक को कॉल करते समय कतार में वापस रखने के लिए आपके पास कोई डेटा नहीं है, तो बस वहां कोई डेटा न डालें। यदि आपकी कतार डेटा से बाहर हो जाती है, तो यह तब तक मौन बजाएगी जब तक कि आप डेटा को फिर से न दबाएं। यदि सभी बफर कतार से बाहर हैं, तो आपके कॉलबैक को फिर से नहीं कहा जाता है, लेकिन आप अभी भी किसी अन्य फ़ंक्शन से कतार में डेटा को एनक्यू कर सकते हैं जो कॉलबैक नहीं है (जैसे ही डेटा फिर से आ गया है)। यह पोस्टर की समस्या नहीं है। उनकी समस्या यह है कि उनके साथ शुरू करने के लिए कतार में केवल एक बफर है। आपको कम से कम 2. – Mecki
धन्यवाद मेकी, मेरे पास एक समान समस्या है, और भले ही समाधान अभी तक लिखा नहीं गया है, कम से कम यह बिंदु सही दिशा में है ... – Nick