Tôi đang viết ứng dụng khách máy tính để bàn từ xa cho iPhone và tôi đang cố triển khai chuyển hướng âm thanh.
Máy khách được kết nối với máy chủ qua kết nối ổ cắm và máy chủ gửi dữ liệu PCM 32K một lúc.Sử dụng Dịch vụ Hàng đợi Âm thanh để phát dữ liệu PCM qua kết nối ổ cắm
Tôi đang cố gắng sử dụng AQS để phát dữ liệu và phát hai giây đầu tiên (1 giá trị bộ đệm). Tuy nhiên, vì đoạn dữ liệu tiếp theo không đi qua ổ cắm, nên AudioQueueBuffer tiếp theo trống. Khi dữ liệu đến, tôi điền vào bộ đệm có sẵn tiếp theo với dữ liệu và đưa nó vào với AudioQueueEnqueueBuffer. Tuy nhiên, nó không bao giờ chơi các bộ đệm này.
Hàng đợi có ngừng phát nếu không có bộ đệm trong hàng đợi, ngay cả khi sau này bạn thêm bộ đệm?
Dưới đây là phần có liên quan của mã:
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--;
}
Cảm ơn!
Bạn không cần phải dán bất kỳ thứ gì có sự im lặng. Nếu bạn không có bất kỳ dữ liệu nào để đưa trở lại hàng đợi khi gọi lại của bạn được gọi, chỉ cần không đặt bất kỳ dữ liệu nào ở đó. Nếu hàng đợi của bạn hết dữ liệu, nó sẽ tự phát âm thanh cho đến khi bạn enqueue dữ liệu một lần nữa. Nếu tất cả các bộ đệm nằm ngoài hàng đợi, hàm gọi lại của bạn không được gọi lại, nhưng bạn vẫn có thể enqueue dữ liệu vào hàng đợi từ một hàm khác không phải là hàm gọi lại (ví dụ: ngay khi dữ liệu đã đến). Đây không phải là vấn đề của người đăng. Vấn đề của anh ta là anh ta chỉ có một bộ đệm trong hàng đợi để bắt đầu. Bạn cần ít nhất 2. – Mecki
Cảm ơn Mecki, tôi có một vấn đề tương tự, và mặc dù giải pháp chưa được viết ra, ít nhất là điểm này đi đúng hướng ... – Nick