1

recordingStatus という int 変数があります。この録音ステータスを「聞いて」、この変数のステータスに基づいてラベルを更新したいと思います。

int recordingStatus;

@property (strong, nonatomic) IBOutlet UILabel *recordingStatusText;

そうしなければならない理由は、recordingStatus が C コード (同じファイル内) で変更されており、C コードが UI 要素にアクセスできない (私が知る限り) ためです。

iOSでこれを行う最もエレガントな方法は何ですか?

C コード コア オーディオ コールバック

static OSStatus rioRecordingCallback(void *inRefCon,
                              AudioUnitRenderActionFlags *ioActionFlags,
                              const AudioTimeStamp *inTimeStamp,
                              UInt32 inBusNumber,
                              UInt32 inNumberFrames,
                              AudioBufferList *ioData) {

// want to access recordingStatus in here, am I able to do it without passsing it in via inRefCon?
}

ありがとう。

橋脚。

4

3 に答える 3

1

オブジェクトrecordingStatusのプロパティを作成します。その後、setter メソッドをオーバーライドし、そのメソッドで必要な UI の更新を実行できます。このように、C コードは UI を気にする必要がなく、Objective-C コードは Objective-C UI の更新を処理できます。

于 2012-11-19T02:24:20.857 に答える
0

これには複数の方法があります。Rickay が指摘したように、それをプロパティにして、セッターをオーバーライドするだけで、ラベルの値も設定できます。

もう 1 つのアプローチは、KVO を使用して監視するrecordingStatusことです (それでもプロパティが必要です)。KVO を使用する非常に優れた方法を探している場合は、ReactiveCocoaをチェックしてください。このタイプの監視-反応パターンは、リアクティブ プログラミングとして知られています。

于 2012-11-19T02:37:41.507 に答える
-1

別のスレッドを参照してiOSのAudioUnitRenderProcからUIコードをトリガーする

オーディオコールバックに渡される構造体にrecordingStatusを配置すると、メインループが平均リフレッシュレート60hzで値をポーリングします。したがって(1/60 == 0.02秒)。

- (void) initTimer
{
self.UIUpdateTimer =
[NSTimer scheduledTimerWithTimeInterval:0.02
                                 target:self selector:@selector(pollValues:)
                               userInfo:nil
                                repeats:YES];
}

- (void) pollValues:(NSTimer *)paramTimer
{
if (rio.recordingStatus==1)
    recordingStatusLabel.text = @"test!";
}
于 2012-11-19T14:07:02.387 に答える