C: записать файл из модуля ядра?

0 Martin L. [2012-06-13 17:22:00]

Я пытаюсь скопировать/написать pcm-bytes (из ALSA-буфера) из пространства ядра в файл в модуле ядра (LKM).

Файл был написан, и размер выглядит нормально для меня, но поскольку его 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 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 target_file@%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);

c file kernel-module fwrite


1 ответ


0 Решение Chris Stratton [2012-06-13 17:32:00]

Во-первых, вы не должны "записывать файлы в ядро".

Для более правильного вопроса о том, как играть без заголовка raw pcm, вы можете использовать функцию импорта смелости.

Или используйте aplay

aplay some_file -t raw -f S16_LE -c 2 -r 44100

С любыми параметрами.