2015-05-19 3 views
4

Я пытаюсь заставить приложение реагировать на claps или выше нормального уровня звука. Для этого я использую Swift и SpriteKit. Я импортировал AVFoundation и, конечно, SpriteKit. Это моя установка:Почему моя функция update() не реагирует на уровни дБ?

let dirPaths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, 
.UserDomainMask, true) 

let docsDir = dirPaths[0] as! String 

let soundFilePath = 
docsDir.stringByAppendingPathComponent("sound.caf") 

let soundFileURL = NSURL(fileURLWithPath: soundFilePath) 

let recordSettings = 
[AVEncoderAudioQualityKey: AVAudioQuality.Min.rawValue, 
AVEncoderBitRateKey: 16, 
AVNumberOfChannelsKey: 1, 
AVSampleRateKey: 44100.0] 

let sprite = SKSpriteNode(imageNamed: "Apple_Swift_Logo") 
let recorder = AVAudioRecorder(URL: soundFileURL, settings: recordSettings as [NSObject : AnyObject], error: nil) 
var impulseAdded = false 

Я получил этот код из this site.

Следующая внутри GameScene и didMoveToView():

//sprite 
    sprite.position = CGPointMake(320, 568) 
    addChild(sprite) 

//recorder; meteringEnabled set to true to allow access to dB levels 
    recorder.meteringEnabled = true 
    recorder.record() 

И, наконец, внутри функции update():

recorder.updateMeters() 
if recorder.averagePowerForChannel(1) > -160 && impulseAdded == false { 
    sprite.physicsBody?.applyImpulse(CGVector(dx: 0,dy: 100)) 
    impulseAdded = true 
}   

Спрайт остается неизменным. Импульс не применяется. В чем моя проблема?

Ссылки:

ответ

1

Это все сводится к этой строке кода:

AVNumberOfChannelsKey: 1 

Это в recordSettings.

Тогда в функции update() этот if recorder.averagePowerForChannel(1) > -160 должен быть изменен следующим образом:

if recorder.averagePowerForChannel(0) > -160 

Это, кажется, работает как массив, он начинается с нуля.

0

Я предлагаю проверить на наличие ошибок записи (from this answer).

var error : NSError? 
AVAudioSession.sharedInstance.setCategory(AVAudioSessionCategoryPlayAndRecord, error:&error) 

if let anError = error { 
    NSLog("Error description: \(anError)") 
} 

или в случае

var error : NSError? 
let recorder = AVAudioRecorder(URL: soundFileURL, settings: recordSettings as [NSObject : AnyObject], error: &error) 
if let anError = error { 
    NSLog("Error description: \(anError)") 
} 

и

var success = recorder.record() 
NSLog("recorded successfully? \(success)") 
+0

Я пробовал это так и аналогично, когда я печатаю() статус записи. Это вернулось. Когда дело доходит до ошибок, я никогда не получаю. – ecoguy

+0

Просить OP проверить наличие ошибок не отвечает на вопрос. Это должен быть комментарий. – JAL

+0

@ecoguy kk, похоже, вы нашли массив каналов проблем. удивил, что ошибка не была более полезной, как «фатальная ошибка: индекс массива вне диапазона» –