6 Stimmen

@synthesize-ing a C array of structs in Objective-C 2.0

Ich versuche, ein Tutorial für eine C++-Schnittstelle in der Mac OS X-API (Audio Queue Services) zu folgen, aber in einem Cocoa (gut, eigentlich nur Foundation) Anwendung (gut, eigentlich nur ein "Werkzeug"). Es hat eine Struktur, die wie folgt aussieht:

static const int kNumberBuffers = 3;                              // 1
struct AQPlayerState {
    AudioStreamBasicDescription   mDataFormat;                    // 2
    AudioQueueRef                 mQueue;                         // 3
    AudioQueueBufferRef           mBuffers[kNumberBuffers];       // 4
    AudioFileID                   mAudioFile;                     // 5
    UInt32                        bufferByteSize;                 // 6
    SInt64                        mCurrentPacket;                 // 7
    UInt32                        mNumPacketsToRead;              // 8
    AudioStreamPacketDescription  *mPacketDescs;                  // 9
    bool                          mIsRunning;                     // 10
};

Ich habe eine Menge Probleme mit der Übersetzung von Artikel 4 in Objective-C, weil ich nicht herausfinden kann, wie man @synthesize ein C-Array. Genauer gesagt, das ist, was ich bis jetzt habe:

PlayerState.h

#import <Foundation/Foundation.h>
#import <AudioToolbox/AudioQueue.h>

@interface PlayerState : NSObject {
  AudioStreamBasicDescription   dataFormat;
  AudioQueueRef                 queue;
  AudioQueueBufferRef           _buffers[3];
  int                           audioFile; // make this an actual type?
  UInt32                        bufferByteSize;
  SInt64                        currentPacket;
  UInt32                        numPacketsToRead;
  AudioStreamPacketDescription* packetDescs;
  bool                          isRunning;
}

@property(assign) AudioStreamBasicDescription   dataFormat;
@property(assign) AudioQueueRef                 queue;
@property(assign) AudioQueueBufferRef           buffers;
@property(assign) int                           audioFile;
@property(assign) UInt32                        bufferByteSize;
@property(assign) SInt64                        currentPacket;
@property(assign) UInt32                        numPacketsToRead;
@property(assign) AudioStreamPacketDescription* packetDescs;
@property(assign) bool                          isRunning;

@end

PlayerState.m

#import "PlayerState.h"

@implementation PlayerState

@synthesize dataFormat;
@synthesize queue;
@synthesize buffers;
@synthesize audioFile;
@synthesize bufferByteSize;
@synthesize currentPacket;
@synthesize numPacketsToRead;
@synthesize packetDescs;
@synthesize isRunning;

@end

@synthesize buffers lässt sich wie folgt nicht kompilieren: "Fehler: Die synthetisierte Eigenschaft 'buffers' muss entweder den gleichen Namen wie ein kompatibles Ivar haben oder explizit ein Ivar benennen"

Dies liegt offensichtlich daran, dass das entsprechende Ivar den Namen _buffers und nicht buffers - aber das ist notwendig, weil ich eine Eigenschaft nicht als Array definieren kann (oder doch? @property(assign) *AudioQueueBufferRef buffers ist ein Syntaxfehler)

Was kann ich tun, um entweder die ivar als ein Array von AudioQueueBufferRef structs, oder synthetisieren Sie die Eigenschaft so, dass sie sich auf die _buffers Array?

0voto

lucius Punkte 8505

Sie können entweder drei Puffer ivars (buffer0, buffer1, buffer2) haben, oder Sie müssen es einen Zeiger auf die AudioQueueBufferRefs machen und separat Speicher zuweisen, um die drei AudioQueueBufferRefs zu halten. Oder Sie verwenden ein NSArray oder NSData, wenn Sie eine variable Anzahl von Puffern benötigen.

Aber zurück zu einem größeren Kontext, Sie wahrscheinlich nicht brauchen, um den Überblick über die AudioQueueBufferRefs zu halten. Wenn Sie alle drei Puffer in die Warteschlange stellen, erhalten Sie Zeiger auf sie in den Audio-Queue-Callbacks.

Ich habe einige Audio-Code, die Aufzeichnungen und Wiedergabe von Audio, und es ruft AudioQueueAllocateBuffer() und AudioQueueEnqueueBuffer() und so ziemlich vergisst über die Puffer nach, dass.

Wenn Sie versuchen, einen Cocoa-Wrapper für AudioQueue zu schreiben, tun Sie das nicht.

Edit: Aber um Ihre ursprüngliche Frage zu beantworten: Du kannst ein Array nicht als Eigenschaft haben, weil es kein "Plain Ol' Data"-Typ ist. Siehe "Deklarierte Eigenschaften" in der Objective-C 2.0 Dokumentation in Xcode, und dies: http://www.fnal.gov/docs/working-groups/fpcltf/Pkg/ISOcxx/doc/POD.html

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X