Tôi đã tìm kiếm và tìm thấy một triệu kết quả cho chủ đề này. Nhưng không có trang nào giúp tôi. Tôi nghĩ rằng tôi có một vấn đề rất phổ biến. Tôi đang chơi xung quanh với lập trình âm thanh đặc biệt là làm việc với hàng đợi âm thanh. Mục đích của chương trình của tôi không quan trọng cho việc giải thích vấn đề. Nhưng trong một nutshell: Tôi nhận được một lỗi khi tôi cố gắng gọi một chức năng mục tiêu-c từ c + + mã. Vì vậy, đây là mã của tôi có chứa các lỗi: AudioRecorder.h:Gọi chức năng C Mục tiêu từ Mã C++
#import <Foundation/Foundation.h>
@interface AudioRecorder : NSObject {
}
-(void)setup;
-(void)startRecording;
-(void)endRecording;
-(void)playAlarmSound;
@end
Và đây là việc thực hiện: AudioRecorder.mm:
#import "AudioRecorder.h"
#include <AudioToolbox/AudioToolbox.h>
#include <iostream>
using namespace std;
@implementation AudioRecorder
static const int kNumberBuffers = 3;
...
static void HandleInputBuffer (void *aqData,
AudioQueueRef inAQ,
AudioQueueBufferRef inBuffer,
const AudioTimeStamp *inStartTime,
UInt32 inNumPackets,
const AudioStreamPacketDescription *inPacketDesc) {
AQRecorderState *pAqData = (AQRecorderState *) aqData;
if (inNumPackets == 0 &&
pAqData->mDataFormat.mBytesPerPacket != 0)
inNumPackets =
inBuffer->mAudioDataByteSize/pAqData->mDataFormat.mBytesPerPacket;
UInt32 size;
AudioQueueGetPropertySize (inAQ, kAudioQueueProperty_CurrentLevelMeter, &size);
char* levelMeterData = new char[size];
AudioQueueGetProperty (inAQ, kAudioQueueProperty_CurrentLevelMeter, levelMeterData, &size);
AudioQueueLevelMeterState* meterState = reinterpret_cast<AudioQueueLevelMeterState*>(levelMeterData);
cout << "mAveragePower = " << meterState->mAveragePower << endl;
cout << "mPeakPower = " << meterState->mPeakPower << endl;
delete levelMeterData;
[self playAlarmSound]; //<--- here I get the error: Use of undeclared identifier 'self'
if (pAqData->mIsRunning == 0)
return;
AudioQueueEnqueueBuffer (pAqData->mQueue, inBuffer, 0, NULL);
}
...
-(void)playAlarmSound {
NSLog(@"Alarmsound....");
}
Khi tôi bỏ qua "[tự playAlarmSound];" sau đó mọi thứ hoạt động tốt. Vậy làm cách nào để gọi hàm Objective-C này từ mã C++ của tôi?
@mbehan bạn đã đúng :) – Joe
Đúng, nhưng tôi cho rằng nguyên nhân sâu xa 'tự' là mất tích là vì đây không phải là một phương pháp của lớp học, không phải vì đó là một chức năng kiểu C. Bất kỳ đối tượng Objective-C nào cũng có thể sử dụng trong hàm này - nó chỉ là 'self' chỉ có sẵn trong các phương thức của một lớp. – Luke
Tôi tin rằng đó là những gì tôi đã nói "tự chỉ tồn tại trong các phương pháp Objective-C và đó là một chức năng kiểu C" có lỗi đánh máy ban đầu khi nó nói nhưng điều đó sẽ truyền tải cùng một thông điệp. – Joe