Properly use Objective C++

后端 未结 2 702
暖寄归人
暖寄归人 2021-02-03 16:31

I\'m coding an app for iOS and I recently #included a C++ header file in an Objective C implementation (.m) file. I changed the extension from .m to .mm and expected everything

2条回答
  •  慢半拍i
    慢半拍i (楼主)
    2021-02-03 16:56

    following the code at Rob Napier's blog I did it for CAAudioUnitOutputCapturer. Thought I would share it to save other folks time.

    RNWrap.h

    //
    //  RNWrap.h
    //
    //  ObjC wrapper for Wrap.cpp
    //
    
    #import 
    #import 
    #import 
    #import 
    #import 
    #import 
    
    struct RNWrapOpaque;
    
    @interface RNWrap : NSObject {
    struct RNWrapOpaque *_cpp;
    }
    
    - (id) initWithAudioUnit:(AudioUnit) au andURL:(CFURLRef) outputFileURL andAudioFileTypeID:(AudioFileTypeID) fileType andAudioStreamBasicDescription: (const AudioStreamBasicDescription) asbd;
    - (void) Start;
    - (void) Close;
    - (void) Stop;
    
    @end
    

    RNWrap.mm

    //
    //  RNWrap.mm
    //  Objective C++ Wrapper Class for CAAudioUnitOutputCapturer.h
    //
    //  Created by Pier 23/10/12
    //  Copyright 2012 DreamUpApps. All rights reserved.
    //
    
    #import "RNWrap.h"
    #import "CAAudioUnitOutputCapturer.h"
    
    @interface RNWrap ()
    @property (nonatomic, readwrite, assign) RNWrapOpaque *cpp;
    @end
    
    @implementation RNWrap
    @synthesize cpp = _cpp;
    
    struct RNWrapOpaque
    {
    public:
        RNWrapOpaque(AudioUnit au, CFURLRef outputFileURL, AudioFileTypeID fileType, const AudioStreamBasicDescription format) : outputCapturer(au, outputFileURL, fileType,  format, 0) {}; // note added bus number = 0 at the end
    CAAudioUnitOutputCapturer outputCapturer;
    };
    
    - (id)initWithAudioUnit:(AudioUnit) au andURL:(CFURLRef) outputFileURL andAudioFileTypeID:(AudioFileTypeID) fileType andAudioStreamBasicDescription: (const AudioStreamBasicDescription) format
    {
    self = [super init];
    if (self != nil)
    {
        self.cpp = new RNWrapOpaque(au, outputFileURL, fileType, format);
    }
    return self;
    }
    
    - (void)dealloc
    {
    delete _cpp;
    _cpp = NULL;
    
    //[super dealloc];
    }
    
    - (void) Start
    {
    self.cpp->outputCapturer.Start();
    }
    
    - (void) Stop
    {
    self.cpp->outputCapturer.Stop();
    }
    
    - (void) Close
    {
    self.cpp->outputCapturer.Close();
    }
    
    @end
    

    You use it like this in your class.

    - (void) captureInAppAudio:(AudioUnit) auToCapture
    {
    AudioStreamBasicDescription destFormat; 
    memset( &destFormat, 0, sizeof(AudioStreamBasicDescription) );
    destFormat.mSampleRate = 44100;
    destFormat.mFormatID = kAudioFormatLinearPCM;
    destFormat.mFormatFlags = ( kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked | kAudioFormatFlagIsBigEndian );
    destFormat.mBytesPerPacket = 2;
    destFormat.mFramesPerPacket = 1;
    destFormat.mBytesPerFrame = 2;
    destFormat.mChannelsPerFrame = 1;
    destFormat.mBitsPerChannel = 16;
    
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    
    soundPath = [documentsDirectory stringByAppendingString:@"/recording.caf"] ;
    CFURLRef fileurl = CFURLCreateWithFileSystemPath(NULL, (CFStringRef)soundPath, kCFURLPOSIXPathStyle, false);
    captor = [[RNWrap alloc] initWithAudioUnit:auToCapture andURL:fileurl andAudioFileTypeID:'caff' andAudioStreamBasicDescription:destFormat];
    
    [captor Start];
    }
    

    Hope this helps someone else out there!

    Pier.

提交回复
热议问题