Как использовать класс CARingBuffer в проекте iOS (iPhone, iPad)? - PullRequest
1 голос
/ 21 августа 2011

В настоящее время я пытаюсь создать аудио проект для iOS, и мне нужно использовать класс CARingBuffer, доступный в папке Extras / CoreAudio / PublicUtility XCode.Проблема в том, что когда я включаю CARingBuffer.h в заголовок моего viewController и объявляю объект CARingBuffer, я получаю 4 ошибки компиляции.

Воспроизвести мою проблему довольно просто.Просто создайте новое приложение на основе представления и попробуйте #include «CARingBuffer.h» в заголовке вашего viewController.

Вот содержимое моего testViewController.h:

    #import <UIKit/UIKit.h>

    #include "CARingBuffer.h"

    @interface testViewController : UIViewController {

    }

    @end

Вотсодержимое моего testViewController.m:

    #import "testViewController.h"

    @implementation testViewController

    - (void)dealloc
    {
        [super dealloc];
    }

    - (void)didReceiveMemoryWarning
    {
        // Releases the view if it doesn't have a superview.
        [super didReceiveMemoryWarning];

        // Release any cached data, images, etc that aren't in use.
    }

    #pragma mark - View lifecycle

    /*
    // Implement viewDidLoad to do additional setup after loading the view, typically                                                         from a nib.
    - (void)viewDidLoad
    {
        [super viewDidLoad];
    }
    */

    - (void)viewDidUnload
    {
        [super viewDidUnload];
        // Release any retained subviews of the main view.
        // e.g. self.myOutlet = nil;
    }

    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
    {
        // Return YES for supported orientations
        return (interfaceOrientation == UIInterfaceOrientationPortrait);
    }

    @end

Ниже приведены 4 ошибки компиляции, расположенные (странным образом) в CARingBuffer согласно XCode 4:

1) Элемент Initializer не является константой в строке:

    const UInt32 kGeneralRingTimeBoundsQueueMask = kGeneralRingTimeBoundsQueueSize - 1;

2) Ожидаемый ';'после объявления верхнего уровня, Ожидаемый '=' ... или ' атрибут ' перед 'CARingBuffer':

    class CARingBuffer {

3) Элемент инициализатора не является константой в строке:

    const UInt32 kGeneralRingTimeBoundsQueueMask = kGeneralRingTimeBoundsQueueSize - 1;

4) Ожидаемый ';'после объявления верхнего уровня, Ожидаемый '=' ... или ' атрибут ' перед 'CARingBuffer':

    class CARingBuffer {

Заранее спасибо за вашу помощь.

Ответы [ 3 ]

1 голос
/ 11 декабря 2011

Также взгляните на эту альтернативу

0 голосов
/ 23 января 2013

Вам нужно изменить свой testViewController.m на testViewController.mm, потому что CARingBuffer - это класс c ++.О том, как его использовать, есть расширение CARingBuffer: CARingBufferEx

//header file
#include "CARingBuffer.h"
class CARingBufferEx : public CARingBuffer {

public:
    CARingBufferEx();
    ~CARingBufferEx();
    CARingBufferError   Store(const AudioBufferList *abl, UInt32 nFrames, SampleTime frameNumber);

    CARingBufferError   Fetch(AudioBufferList *abl, UInt32 nFrames, SampleTime frameNumber);

private:
    SInt64 firstInputSampleTime;
    SInt64 firstOutputSampleTime;
    SInt64 offset;

};

//Class 
#include "CARingBufferEx.h"
#include "stdio.h"

CARingBufferEx::CARingBufferEx():firstInputSampleTime(-1), firstOutputSampleTime(-1), offset(0) {
}
CARingBufferEx::~CARingBufferEx() {

}

CARingBufferError CARingBufferEx::Store(const AudioBufferList *abl, UInt32 nFrames, SampleTime frameNumber) {
    if (firstInputSampleTime < 0) {
        firstInputSampleTime = frameNumber;
        if (firstOutputSampleTime > 0 && offset == 0) {
            offset = firstInputSampleTime - firstOutputSampleTime;
        }
    }
    return CARingBuffer::Store(abl, nFrames, frameNumber);
}

CARingBufferError CARingBufferEx::Fetch(AudioBufferList *abl, UInt32 nFrames, SampleTime frameNumber) {
    if (firstOutputSampleTime < 0) {
        firstOutputSampleTime = frameNumber;
        if (firstInputSampleTime > 0 && offset == 0) {
            offset = firstInputSampleTime - firstOutputSampleTime;
        }
    }
    return CARingBuffer::Fetch(abl, nFrames, frameNumber + offset);
}

Использование:

  CARingBufferEx*         _musicMixerRingBuffer;
  _musicMixerRingBuffer = new CARingBufferEx();
  _musicMixerRingBuffer->Allocate(2, sizeof(AudioUnitSampleType), 1024 * 50);
  //1024 is length for one package. and 50 means this buffer contains 50 packages at most.

  //store 
  //ioData is AudioBufferList ,inTimeStamp is AudioTimeStamp 
  musicMixerRingBuffer->Store(ioData, inNumberFrames, inTimeStamp->mSampleTime);
  //Fetch
  musicMixerRingBuffer->Fetch(ioData, inNumberFrames, inTimeStamp->mSampleTime);
0 голосов
/ 09 сентября 2011

Вам нужно переименовать класс, в который вы включаете кольцевой буфер, в файл .mm.

Это говорит компилятору использовать цель c ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...