2012-06-13 2 views
0

Я пытаюсь скопировать/написать 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); 
+0

Это выглядит правильно. Я предполагаю, что медиа-плеер просто не понимает файл, потому что это raw PCM. Попробуйте украсть заголовок RIFF из существующего wav-файла и добавить его в файл, а затем повторите попытку. – Polynomial

ответ

0

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

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

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

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

С независимо от параметров являются подходящими.

+0

Эй, да, я знаю, что писать файлы в ядре нехорошо. Это просто проверить функциональность currenct. Я попробую aplay-tip, но это не так просто, потому что модуль находится на android (нет aplay). Но, может быть, в моей машине. –

+0

Отлично, большое спасибо за этот типп! –