ELL*_*BLE 6 c macos cocoa objective-c
我正在尝试在Mac OS X API(音频队列服务)中遵循C++接口的教程,但是在Cocoa(实际上只是基础)应用程序(实际上只是一个'工具').它有一个如下所示的结构:
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
};
Run Code Online (Sandbox Code Playgroud)
我将第4项转换为Objective-C时遇到了很多麻烦,因为我无法弄清楚如何@synthesize
使用C数组.具体来说,这是我到目前为止:
#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
Run Code Online (Sandbox Code Playgroud)
#import "PlayerState.h"
@implementation PlayerState
@synthesize dataFormat;
@synthesize queue;
@synthesize buffers;
@synthesize audioFile;
@synthesize bufferByteSize;
@synthesize currentPacket;
@synthesize numPacketsToRead;
@synthesize packetDescs;
@synthesize isRunning;
@end
Run Code Online (Sandbox Code Playgroud)
@synthesize buffers
无法编译如下:"错误:合成属性'缓冲区'必须与兼容的ivar命名相同或必须明确命名为ivar"
这显然是因为相应的ivar被命名_buffers
而不是buffers
- 但这是必要的,因为我不能将属性定义为数组(我可以吗?@property(assign) *AudioQueueBufferRef buffers
是语法错误)
我可以做什么来将ivar定义为AudioQueueBufferRef
结构数组,或者合成属性以使其引用_buffers
数组?
编辑: Peter Hosey指出 C 中的数组与指针不同。(详细信息请参阅本文档)。这可以解释您所看到的错误,并且会使我发布的代码错误。
gs在他的回答中链接到的另一个问题提出了一种解决方法,我在这个问题的上下文中复制了该解决方法:
// PlayerState.h:
@interface PlayerState : NSObject
{
AudioQueueBufferRef _buffers[3];
}
@property(readonly) AudioQueueBufferRef * buffers;
Run Code Online (Sandbox Code Playgroud)
// PlayerState.m:
@implementation PlayerState
@dynamic buffers;
- (AudioQueueBufferRef *)buffers { return _buffers; }
@end
Run Code Online (Sandbox Code Playgroud)
这将允许您buffers
像访问对象数组的指针一样进行访问AuidoQueueBufferRef
。
归档时间: |
|
查看次数: |
15349 次 |
最近记录: |