#c #swift #pointers
#c #swift #указатели
Вопрос:
Я пытаюсь написать приложение на Swift, которое использует эту библиотеку для воспроизведения модных музыкальных файлов: https://github.com/martincameron/micromod/tree/master/ibxm-ac
В библиотеке есть метод с именем replay_get_audio, который принимает, наряду с фактическими данными, подлежащими обработке (воспроизведение и отключение звука), указатель int на буфер, в который должны быть записаны аудиоданные (mix_buf):
int replay_get_audio( struct replay *replay, int *mix_buf, int mute )
Проблема в том, что независимо от того, что я делаю, я не могу получить доступ к данным, которые записываются в этот буфер в Swift. Он отображается в виде массива нулей в инспекторе переменных, когда я преобразую указатель bufferPointer в данные в массив:
let dataSize = Int(calculate_mix_buf_len(44100)) // 14040 is the output for my mod file - this is the necessary memory allocation amount for mix_buf according to the library
let mixBufDataPointer = UnsafeMutablePointer<Int32>.allocate(capacity: dataSize)
let resultingNumSamplesWrittenToMixBuf = replay_get_audio(replay, mixBufDataPointer, 0) // The function outputs the number of samples written to mixBuf - it is returning 882 for my mod file, so I assume it is writing the data successfully
let mixBufBufferPointer = UnsafeMutableBufferPointer(start: mixBufDataPointer, count:dataSize)
let arrayDataForMixBuf = Array(mixBufBufferPointer) // An array of 14040 Int32s - all with the value of 0...as if the data is not being written
Если я вручную записываю значение, скажем, в mixBufDataPointer[1] , я вижу, что оно отображается в arrayDataForMixBuf , поэтому я знаю, что чтение с использованием mixBufBufferPointer и связанное с ним преобразование массива работают правильно. Проблема, по-видимому, заключается в том, что библиотека записывает данные в mixBufDataPointer.
Я что-то упустил? Я совершенно новичок в указателях в Swift, так что все это для меня ново.
Комментарии:
1. Показанный вами код Swift выглядит нормально. Проблема где-то в другом месте, возможно, в
replay_get_audio
. Для теста вы можетеreplay_get_audio
заменить его своим собственным кодом на C, который просто записывает некоторые данные. Затем это будет отображаться на стороне Swift.2. Инспектор переменных в XCode иногда показывает нули, даже если в памяти есть другое значение. Это известная ошибка. Попробуйте вывести значение вашего буфера в журнал и проверить его там.