Я пишу быстрое приложение с функцией объектива-С, чтобы перевернуть аудиофайл. Я очень новичок в Objective-C, и у меня возникает проблема с остановкой моего цикла, даже когда моя переменная readPoint становится отрицательной. Как остановить этот цикл, когда он достигнет нуля?Цель-C: Почему моя петля не заканчивается?
#import "objectFile.h"
#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h>
#import <CoreAudio/CoreAudioTypes.h>
@implementation objectFile
-(void)callMethodFromObjectiveC{
NSURL *recordedAudioUrl;
NSURL *flippedAudioUrl;
NSUserDefaults *defaults=[NSUserDefaults standardUserDefaults];
NSString *savedURL=[defaults objectForKey:@"savedURL"];
NSString *reverseURL=[defaults objectForKey:@"reverseURL"];
recordedAudioUrl = [NSURL URLWithString:[savedURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
NSLog(@"url is %@", [recordedAudioUrl absoluteString]);
flippedAudioUrl = [NSURL URLWithString:[reverseURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
NSLog(@"url is %@", [flippedAudioUrl absoluteString]);
AudioFileID outputAudioFile;
AudioStreamBasicDescription myPCMFormat;
myPCMFormat.mSampleRate = 16000.00;
myPCMFormat.mFormatID = kAudioFormatLinearPCM ;
myPCMFormat.mFormatFlags = kAudioFormatFlagsCanonical;
myPCMFormat.mChannelsPerFrame = 1;
myPCMFormat.mFramesPerPacket = 1;
myPCMFormat.mBitsPerChannel = 16;
myPCMFormat.mBytesPerPacket = 2;
myPCMFormat.mBytesPerFrame = 2;
AudioFileCreateWithURL((__bridge CFURLRef)flippedAudioUrl,
kAudioFormatMPEG4AAC,
&myPCMFormat,
kAudioFileFlags_EraseFile,
&outputAudioFile);
AudioFileID inputAudioFile;
OSStatus theErr = noErr;
UInt64 fileDataSize = 0;
AudioStreamBasicDescription theFileFormat;
UInt32 thePropertySize = sizeof(theFileFormat);
theErr = AudioFileOpenURL((__bridge CFURLRef)recordedAudioUrl, kAudioFileReadPermission, 0, &inputAudioFile);
thePropertySize = sizeof(fileDataSize);
theErr = AudioFileGetProperty(inputAudioFile, kAudioFilePropertyAudioDataByteCount, &thePropertySize, &fileDataSize);
UInt64 dataSize = fileDataSize;
void* theData = malloc(dataSize);
UInt64 readPoint = dataSize;
UInt64 writePoint = 0;
while(readPoint > 0)
{
UInt32 bytesToRead = 2;
AudioFileReadBytes(inputAudioFile, false, readPoint, &bytesToRead, theData);
AudioFileWriteBytes(outputAudioFile, false, writePoint, &bytesToRead, theData);
writePoint += 2;
readPoint -= 2;
}
free(theData);
AudioFileClose(inputAudioFile);
AudioFileClose(outputAudioFile);
}
@end
положить перерыв; заявление на разрыв цикла. –
Благодарим вас за ответ. Где бы я разместил перерыв? ? – Derek
@AvijitNagare 'while (readPoint> 0)' достаточно для завершения цикла, когда «readPoint - = 2» принимает значение в отрицательное, добавление оператора «if» просто вводит избыточность в код. не нужно дополнительно проверять. Я бы посмотрел на ответ Гэндальфса ниже. –