2012-02-19 10 views
0

私はCの経験豊富なプログラマーですが、客観的なcではありません。私は客観的なcで彼にこのコードを渡すことで友人を助けようとしています。ところで、これはiPhoneアプリケーション用です。私は必要なすべての基盤を持っていますが、あなたが見ることができるように、 - (IBAction)メソッドを使用して私のサウンドをsoundAとして宣言しました...さらに、サウンドは100 KB以下の単純な.wavファイルです。CコードからObjCに変換

- (IBAction)soundA:(id)sender { 
    CFBundleRef mainBundle = CFBundleGetMainBundle(); 
    CFURLRef soundFileURLRef; 
    soundFileURLRef = CFBundleCopyResourceURL(mainBundle, 
     (CFStringRef) @"soundA", CFSTR ("wav"), NULL); 

    UInt32 soundID; 
    AudioServicesCreateSystemSoundID(soundFileURLRef, &soundID); 
    AudioServicesPlaySystemSound(soundID); 
} 

ご協力いただきありがとうございます。本当にありがとう。

  • ジョングク
+0

質問は何ですか? –

+1

ObjCはCのスーパーセットなので、CコードもObjCコード – ouah

+0

'CFBundleCopyResourceURL'は名前にcopyを持っていますので、あなたが所有するメモリを返します。あなたのコードでは 'soundFileURLRef'が結果としてリークします。 'audioServicesCreateSystemSoundID'は' create 'メソッドであるため、 'soundID'に関連するメモリについてはDittoです。 – Tommy

答えて

1

たぶんSystemSoundID

- (IBAction)soundA:(id)sender { 
     CFBundleRef mainBundle = CFBundleGetMainBundle(); 
     CFURLRef soundFileURLRef; 
     soundFileURLRef = CFBundleCopyResourceURL(mainBundle, 
      (CFStringRef) @"soundA", CFSTR ("wav"), NULL); 

     SystemSoundID soundID; 
     AudioServicesCreateSystemSoundID(soundFileURLRef, &soundID); 
     AudioServicesPlaySystemSound(soundID); 
    } 

以上のObjective-Cのアプローチで行くにunsigned int型からそれを変更してみてください:

- (IBAction)soundA:(id)sender { 
     NSString *path = [NSString stringWithFormat: @"%@/%@", 
        [[NSBundle mainBundle] resourcePath], name]; 


     NSURL* filePath = [NSURL fileURLWithPath: path isDirectory: NO]; 
     SystemSoundID soundID; 
     AudioServicesCreateSystemSoundID((CFURLRef)filePath, &soundID); 
     AudioServicesPlaySystemSound(soundID); 
    } 
+0

また、[[NSBundle mainBundle] URLForResource:@ "soundA" withExtension:@ "wav"] 'は、最初の2行を折りたたんでいますか? – Tommy

+0

しかし、[[NSBundle mainBundle] URLForResource:@ "soundA" withExtension:@ "wav"] ... ... *パスは宣言されません。どうすればこの問題を回避できますか? – leesuh

+0

2番目の方法をそのまま使用して回避してください。 – CodaFi

関連する問題