Как я синтезирую звуки с CoreAudio на iPhone/Mac

В зависимости от того, насколько умный Ваша собственная реализация системы регистрации.

В Java, если бы Вы хотите наследовать типы журнала, и т.д., это могло бы быть слишком много стычки, и Вы предпочли бы стороннюю программу как Log4J. Я предполагаю, что существуют подобные вещи для C#. Так же, если Вы хотите определить уровень журнала из командной строки.

, Если Вы просто хотите направить весь свой System.out и управлять, печатаются ли они каждый раз, когда Вы компилируете, Ваш собственный регистратор сделал бы очень хорошо.

17
задан AlBlue 1 September 2009 в 08:27
поделиться

2 ответа

Что вы хотите сделать, это, вероятно, настроить AudioQueue. Это позволяет вам заполнить буфер синтезированными аудиоданными в обратном вызове. Вы должны настроить AudeioQueue для работы в новом потоке как таковой:

#define BUFFER_SIZE 16384
#define BUFFER_COUNT 3
static AudioQueueRef audioQueue;
void SetupAudioQueue() {
    OSStatus err = noErr;
    // Setup the audio device.
    AudioStreamBasicDescription deviceFormat;
    deviceFormat.mSampleRate = 44100;
    deviceFormat.mFormatID = kAudioFormatLinearPCM;
    deviceFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger;
    deviceFormat.mBytesPerPacket = 4;
    deviceFormat.mFramesPerPacket = 1;
    deviceFormat.mBytesPerFrame = 4;
    deviceFormat.mChannelsPerFrame = 2;
    deviceFormat.mBitsPerChannel = 16;
    deviceFormat.mReserved = 0;
    // Create a new output AudioQueue for the device.
    err = AudioQueueNewOutput(&deviceFormat, AudioQueueCallback, NULL,
                              CFRunLoopGetCurrent(), kCFRunLoopCommonModes,
                              0, &audioQueue);
    // Allocate buffers for the AudioQueue, and pre-fill them.
    for (int i = 0; i < BUFFER_COUNT; ++i) {
        AudioQueueBufferRef mBuffer;
        err = AudioQueueAllocateBuffer(audioQueue, BUFFER_SIZE, mBuffer);
        if (err != noErr) break;
        AudioQueueCallback(NULL, audioQueue, mBuffer);
    }
    if (err == noErr) err = AudioQueueStart(audioQueue, NULL);
    if (err == noErr) CFRunLoopRun();
  }

После этого будет вызываться метод обратного вызова AudioQueueCallback, когда AudioQueue потребует больше данных. Реализуйте что-то вроде:

void AudioQueueCallback(void* inUserData, AudioQueueRef inAQ,
                        AudioQueueBufferRef inBuffer) {
    void* pBuffer = inBuffer->mAudioData;
    UInt32 bytes = inBuffer->mAudioDataBytesCapacity;
    // Write max <bytes> bytes of audio to <pBuffer>
    outBuffer->mAudioDataByteSize = actualNumberOfBytesWritten
    err = AudioQueueEnqueueBuffer(audioQueue, inBuffer, 0, NULL);
}
13
ответ дан 30 November 2019 в 14:12
поделиться

Многие аудиотехнологии позволяют передавать данные вместо звукового файла. AVAudioPlayer, например, имеет:

-initWithData:error:
Initializes and returns an audio player for playing a designated memory buffer.

- (id)initWithData:(NSData *)data error:(NSError **)outError

Однако я не уверен, как вы могли бы передать ptr данных, запустить звук, а затем сохранить его в цикле, передавая другие ptrs данных, или повторяя то же самое и т. Д.

0
ответ дан 30 November 2019 в 14:12
поделиться