Я пытаюсь скопировать/написать pcm-байты (из ALSA-буфера) из пространства ядра в файл в ядре-модуле (LKM).C: записать файл из модуля ядра правильно?
Файл получен, и размер выглядит нормально для меня, но поскольку это PCM-данные, я не вижу, правильно ли это (необработанные аудиоданные, не читаемые).
Мои аудиоплееры (MPlayer = «Неверный поиск в отрицательном положении ffffffffffffffff!», VLC, Foobar2000) не могут воспроизвести мой письменный файл, поэтому я думаю, что у меня ошибка в моем коде.
Когда я открываю файл через SCITE, я вижу много «NUL» и других кричащих вещей (bytes;).
Возможно, один из вас нашел ошибку?
У меня есть этот скрипт:
unsigned char *dma_area; // this is the source, an mmapped-area
int pcm_offset_bytes; // the actual offset in the dma_area
int size_bytes; // the amount of bytes to copy
struct file *target_file; // the target-file
int ret; // used in write-process below
int wrote = 0; // used in write-process below
mm_segment_t fs;
void *data; // dma_area + pcm_offset_bytes
// (..) calculate offset and size
// open the target file
target_file = filp_open("/dev/snd/pcmC0D0p_output", (O_CREAT | O_TRUNC | O_WRONLY), (S_IRWXU | S_IRWXG | S_IRWXO));
data = dma_area + pcm_offset_bytes
fs = get_fs();
set_fs (get_ds());
if (!target_file || !target_file->f_op || !target_file->f_op->write) {
LOGI("something's missing\n");
return -EIO;
}
// loop until every byte is written
while (size_bytes > 0) {
ret = target_file->f_op->write(target_file, (char *)data, size_bytes, &target_file->f_pos);
LOGI ("wrote %d bytes to [email protected]%p, return %d\n", size_bytes, target_file, ret);
if (ret <= 0)
goto done;
size_bytes -= ret;
data += ret;
wrote += ret;
}
ret = wrote;
done:
set_fs(fs);
LOGI("result %d\n", ret);
Это выглядит правильно. Я предполагаю, что медиа-плеер просто не понимает файл, потому что это raw PCM. Попробуйте украсть заголовок RIFF из существующего wav-файла и добавить его в файл, а затем повторите попытку. – Polynomial