В данный момент бьюсь над задачей (работаю на Visual C++ 2005):
Нужно сделать так, чтобы вызов ogg-vorbis библиотечной функции ov_open, которая открывает файловый указатель на уже открытый ogg-файл была заменена другой функцией (скорее всего ov_open_callbacks(datasource, &vf, NULL, fileSize/* или обычно 0 */, callbacks)), где datasource является void* указателем очевидно на начало копии ogg-файла в памяти.
- Код: Выделить всё
FILE *f = fopen(filename, "rb");
ov_open(f, &vf, NULL, 0); // вместо вызова этой функции пытаюсьov_open_callbacks(fileImagePointer, &vf, NULL, fileSize/* или обычно 0 */, callbacks); // пытаюсь воспользоваться этой ф-ей
.
Такая необходимость возникла из-за требования работать не с файловым указателем f (так как у пользователей программы не будут размещены ogg-файлы в явном виде), а с указателем на двоичную копию файла в оперативной памяти (так как все звуковые и некоторые иные файлы будут запакованы в виде сплошного монолитного файла, из недр которого звуковой ogg-файл будет скопирован в нужный момент в оперативную память, после чего указатель на начало этой копии файла будет известен).
Создать бинарную копию файла в оперативную память удаётся легко, но вот попытки воспользоваться указателем на начало этой копии не увенчались пока успехом.
Надеюсь, что может кто-нибудь когда-нибудь сталкивался с подобной проблемой и вдруг даст ценный намёк, где что поискать. В поисковиках пока на русском языке ничего не нашёл. В оригинальной англо-язычной документации (из библиотечных архивов ogg-vorbis) тоже не нашёл примеров кода для случая работы с копиями ogg-файлов в памяти.
Немного более обобщённый вопрос: можно ли использовать в Си-функциях файлового ввода/вывода вместо указателя на файл (типа FILE*) void* указателем на начало двоичной копии этого файла? Явно у меня это не получается. Приведения void* указателя к типу FILE* приводят к ошибкам во время исполнения.
Значит функции файлового ввода/вывода каким-то образом небезразличны к тому, откуда они черпают совершенно идентичные нули и единицы, из дисков или из оперативки...
Удалось пока сделать немного хитро-криво. Пришлось создавать на несколько миллисекунд ogg-файл, забрасывать в него всё бинарное содержимое из копии оригинального ogg-файла в памяти. После этого удаётся успешно воспользоваться функциями ogg-vorbis библиотек, и смело удалять временный файл. Как сырой вариант исправно работающего класса я думаю на первое время пойдёт.