Вы используете общий FileName
для каждой записи, следовательно, он отменяет предыдущую. Чтобы вести список записей и отображать их в tableView
, вам нужно поддерживать массив имен записей. Вот код:
class ViewController: UIViewController , AVAudioPlayerDelegate , AVAudioRecorderDelegate {
var aryRecordingNames:[String] = [] //to store recording filenames
.....
.....
func preprareAndBeginNewRecording() {
let fileName = "audioFile_" + "\(aryRecordingNames.count)" + ".m4a"
aryRecordingNames.append(fileName)
let audioFilename = getDocumentsDirectory().appendingPathComponent(fileName)
let recordSetting = [ AVFormatIDKey : kAudioFormatAppleLossless,
AVEncoderAudioQualityKey : AVAudioQuality.max.rawValue,
AVEncoderBitRateKey : 320000,
AVNumberOfChannelsKey : 2,
AVSampleRateKey : 44100.2] as [String : Any]
do {
soundRecorder = try AVAudioRecorder(url: audioFilename, settings: recordSetting )
soundRecorder.delegate = self
soundRecorder.prepareToRecord()
soundRecorder.record()
} catch {
print(error)
}
}
func prepareAndPlayAudioAtIndex(_ index:Int) {
let fileName = "audioFile_" + "\(index)" + ".m4a"
let audioFilename = getDocumentsDirectory().appendingPathComponent(fileName)
do {
soundPlayer = try AVAudioPlayer(contentsOf: audioFilename)
soundPlayer.delegate = self
soundPlayer.prepareToPlay()
soundPlayer.volume = 1.0
soundPlayer.play()
} catch {
print(error)
}
}
}
Каждый раз, когда вы собираетесь запустить новую запись, используя preprareAndBeginNewRecording()
, вы фактически создаете новое имя файла и добавляете его в aryRecordingNames
и в методе делегата audioRecorderDidFinishRecording()
перезагружаете tableView, чтобы получить новую запись на список.
Если вы хотите воспроизвести файл для определенной записи, то у вас должен быть индекс из tableViewCell (из которого выбрана кнопка воспроизведения), просто вызовите метод prepareAndPlayAudioAtIndex
с этим индексом.
Вот код для отображения списка и воспроизведения записи с использованием UITableView
extension ViewController:UITableViewDataSource,UITableViewDelegate{
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return aryRecordingNames.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "RecordingCell") as? RecordingCell else {
return UITableViewCell()
}
// configure your cell here
return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
//you can do this work on button click as well, I am assuming playback begins on UITableViewCell did select
prepareAndPlayAudioAtIndex(indexPath.row)
}
}