【发布时间】:2010-10-05 23:05:57
【问题描述】:
我正在尝试遵循 Mac OS X API(音频队列服务)中的 C++ 接口教程,但在 Cocoa(嗯,实际上只是 Foundation)应用程序中(嗯,实际上只是一个“工具”)。它的结构如下所示:
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
};
我在将第 4 项翻译成 Objective-C 时遇到了很多麻烦,因为我不知道如何 @synthesize 一个 C 数组。具体来说,这是我目前所拥有的:
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 编译失败,如下所示:“错误:综合属性 'buffers' 必须与兼容的 ivar 命名相同或必须显式命名 ivar”
这显然是因为对应的ivar被命名为_buffers而不是buffers——但这是必要的,因为我不能将属性定义为数组(可以吗?@property(assign) *AudioQueueBufferRef buffers是语法错误)
如何将 ivar 定义为 AudioQueueBufferRef 结构的数组,或合成属性以使其引用 _buffers 数组?
【问题讨论】:
-
我不敢相信我在将近一年后遇到了同样的问题……同时尝试做我写这篇文章时想做的同样的事情。我有一个可怕的记忆。此外,没有人回答它 d-;
-
我想我已经回答了你的问题。总比一年后再次找到它要好,对吧?祝你好运。
标签: c objective-c cocoa macos