Да се ​​заменят ли функциите на файла на c библиотеката?

Работя върху игра и едно от изискванията на лицензионното споразумение за звуковите активи, които използвам, е те да бъдат разпространявани по начин, който ги прави недостъпни за крайния потребител. И така, мисля да ги агрегирам в плосък файл, да ги криптирам или нещо подобно. Проблемът е, че звуковата библиотека, която използвам (Hekkus Sound System), приема само файлов път 'char*' и обработва вътрешно четене на файлове. Така че, ако трябва да продължа да го използвам, ще трябва да отменя функциите на файла c stdio, за да се справя с криптиране или каквото реша да направя. Това изглежда възможно, но ме притеснява. Гледайки в мрежата, виждам хора да се сблъскват със странни разочароващи проблеми, правейки това на платформи, които ме интересуват (Win32, Android и iOS).

Случайно да има междуплатформена библиотека, която да се грижи за това? Има ли по-добър подход, който бихте препоръчали изцяло?


person Vigabrand    schedule 03.09.2013    source източник
comment
Бихте ли могли да ги декодирате и да ги запишете недекодирани в /tmp файл и след това да извикате отварянето и след това да ги прекратите връзката веднага след отварянето? Файловият дескриптор в Hekkus ще остане валиден след отварянето. (редактиране: идеята за ram диск по-долу изглежда по-добра)   -  person Charlie Burns    schedule 03.09.2013
comment
Определете недостъпен. Ако възпроизвеждате звук на системата на потребителя, това звучи доста достъпно за мен. Както и да е, относно Hekkus Sound System - уебсайтът на автора казва, че предлага източници на всеки, който се интересува. Така че най-лесното вероятно би било да получите изходния код и да го закърпите. Странно е обаче, че звуковата библиотека не абстрахира начина на получаване на данни в нея.   -  person n0rd    schedule 03.09.2013
comment
Моля, не предефинирайте резервиран идентификатор в C, това би предизвикало недефинирано поведение. Проектът на стандарт C99 казва (Приложение J, раздел J.2): Поведението е недефинирано при следните обстоятелства: [...] Програмата се опитва да декларира сама библиотечна функция, вместо чрез стандартна заглавка, но декларацията няма външна връзка (7.1.2). Програмата декларира или дефинира запазен идентификатор, различен от позволения от 7.1.4 (7.1.3).   -  person Lorenzo Donati -- Codidact.com    schedule 03.09.2013
comment
коя инструментална верига използвате?   -  person secmask    schedule 03.09.2013
comment
@charlie burns Това може да работи, въпреки че ще бъде по-бавно и времето за зареждане вече е проблем. Това поведение при броене на препратки на файлови дескриптори част ли е от стандарта (преносим)?   -  person Vigabrand    schedule 03.09.2013
comment
@n0rd те не искат крайните потребители да вземат файловете и да ги използват сами. Благодаря, това напълно ми липсваше в уебсайта, ще опитам.   -  person Vigabrand    schedule 03.09.2013
comment
@secmask точно сега само msvc, още не съм започнал пренасянето.   -  person Vigabrand    schedule 03.09.2013
comment
@LorenzoDonati това не би предефинирало запазен идентификатор, а по-скоро промяна на връзката по време на изпълнение чрез специфични за операционната система извиквания   -  person Vigabrand    schedule 03.09.2013
comment
Мисля, че можете да разчитате на това поведение при отваряне/прекратяване на връзката в unix. Нямам представа от windows.   -  person Charlie Burns    schedule 03.09.2013
comment
Съжалявам, грешно съм разбрал изречението ви. Ще трябва да отменя функциите на файла c stdio[...]. Както и да е, като промените връзката [...] имате предвид, че ще се свържете (евентуално динамично) срещу различно време за изпълнение? Ако е така, сигурни ли сте, че промяната на основната реализация на файловите функции не задейства недефинирано поведение?   -  person Lorenzo Donati -- Codidact.com    schedule 03.09.2013


Отговори (6)


Имате ли възможност да използвате наименуван канал вместо обикновен файл? Ако е така, можете да представите канала на звуковата библиотека като файл за четене и можете да дешифрирате данните си и да ги запишете в канала, без проблем. (Вижте Ръководството на Beej за обяснение на именувани тръби.)

person This isn't my real name    schedule 03.09.2013
comment
аз не разбирам Изглежда казвате, че вместо да предавате звукови данни на библиотеката, трябва да й подадете името на файл. Ако случаят е такъв, наименуваната тръба, наричана още FIFO, може да бъде решението. Наименуваната тръба се представя като файл във файловата система, така че каквото и да отвори файла за четене, се намира в приемащия край на вашата тръба, вместо да чете файл на диска. По този начин вашата програма може да създаде именувана тръба, да прехвърли името на файла на тръбата към звуковата библиотека и да запише дешифрирани аудио данни, за да запише края на тръбата. - person This isn't my real name; 03.09.2013
comment
Наименуваният канал в Unix е файл, който може да бъде отворен като обикновен файл, следователно името му е обикновен 'char *' и аудио библиотеката не би трябвало да има проблем при четене от него. Той обаче трябва да бъде създаден с помощта на функцията mkfifo, например в друга нишка на вашата програма, и записан в него, в противен случай fopen ще блокира (вижте stackoverflow.com/questions/580013/) - person SirDarius; 03.09.2013
comment
Наименувана тръбна платформа независима? Това също предполага, че знаете как библиотеката отваря файла на различни платформи. - person Martin Schlott; 03.09.2013
comment
За съжаление това изглежда е само за Linux? - person Vigabrand; 03.09.2013
comment
Или по-скоро Windows има тази възможност, но за съжаление не е съвместима с fopen. - person Vigabrand; 03.09.2013
comment
Посочили сте Android и iOS като платформи, които ви интересуват, и изглежда, че Google показва, че и двете платформи поддържат POSIX. Windows, който не посочихте като платформа, представляваща интерес, е добре известно, че не поддържа добре POSIX (ако изобщо го поддържа), така че не, това няма да работи там. - person This isn't my real name; 03.09.2013
comment
Въпреки това, според отговора на @Martin Schlott windows има същата функционалност (не POSIX, разбира се) и е съвместим с fopen, така че това може да работи в крайна сметка... - person Vigabrand; 04.09.2013
comment
Мисля, че това ще проработи, така че ще отбележа като отговорено, освен ако не разбера друго - person Vigabrand; 04.09.2013
comment
Направих това сам с конзолно приложение, очаквайки път към файла. Дадох му наименуван канал, създаден с CreateFile и той работи перфектно. Независимо от това, поведението между Windows и базираната на POSIX система е различно, това не ви оставя друг избор освен разликата между MS и останалия свят. - person Martin Schlott; 04.09.2013

Замяната на stdio по начин, по който библиотека, която не знаете как точно работи, работи по начин, който разработчикът не е имал предвид, не изглежда като правилния подход за мен, тъй като не е много лесно. Внедряването на ramdrive изисква толкова много усилия, че препоръчвам да потърсите друга аудио библиотека.

Hekkus Sound System, която открих, е изградена от един човек и последно актуализирана през 2012 г. Не бих разчитал на библиотека като само един човек работи върху него, без да споделя източниците.

Моят съвет, инвестирайте времето си в търсене на подходяща звукова библиотека, вместо да търсите странна работа за тази.

person Martin Schlott    schedule 03.09.2013
comment
Чувам те. Но би било жалко, ако се стигне дотам, тъй като освен този проблем, Hekkus се доказа като библиотека с много висококачествени функции, пълна и лесна за използване, въпреки че е дело на един човек, и е междуплатформена за платформите, които аз грижа за. Защо казвате, че замяната на stdio е трудна? Изглежда, че добавянето на тънък слой, който извършва просто декриптиране, не би трябвало да е твърде трудно, стига да накарам действителната функция да работи. - person Vigabrand; 03.09.2013
comment
Това може да е така и това е изцяло ваше решение, разбира се. Честно казано, не знам начин да заменя stdio по независим от платформата начин. За напр. решение за Windows е да се създаде наименуван канал, можете да създадете път към наименуван канал, който може да бъде отворен от всяка stdio файлова функция. Има подобен механизъм за linux, но не знам дали е същият за друга платформа като iPhone или Android. За Windows, създавайки именуван канал, можете да използвате CreateFile на API на Windows. Доколкото знам, няма налична (все още) независима от платформата библиотека с именувани тръби. - person Martin Schlott; 03.09.2013
comment
Чрез замяна на stdio това, което имах предвид, беше замяна на fopen/fread/etc чрез dlsym на *nix и еквивалента (хм има ли такъв?) на windows - person Vigabrand; 04.09.2013
comment
Но да, може би сте прави, когато се нуждаете от различна библиотека - person Vigabrand; 04.09.2013

Една от възможностите е да използвате шифрована loopback файлова система (google за допълнителни ресурси).

Начинът, по който работи това, е, че поставяте активите си в криптирана файлова система, която всъщност живее в обикновен файл. Тази файлова система се монтира някъде като устройство за обратна връзка. Паролата трябва да бъде предоставена по време на прикачване/монтиране. Веднъж монтирани, всички файлове са достъпни като обикновени файлове за вашия софтуер. Но иначе файловете са криптирани и недостъпни.

person Ziffusion    schedule 03.09.2013
comment
Това изглежда е концепция само за Linux? - person Vigabrand; 03.09.2013
comment
Повечето *nix OS (включително MacOS) изглежда го имат en.wikipedia.org/wiki/Loop_device. Освен това, тъй като Android е производно на Linux, той също трябва да го има. - person Ziffusion; 03.09.2013
comment
Все пак ще пускам и на Windows. - person Vigabrand; 03.09.2013
comment
Сигурен съм, че можете да намерите нещо. sourceforge.net/projects/freeotfe.mirror - person Ziffusion; 03.09.2013

Това зависи от компилатора и не е гарантирана функция, но много ви позволяват да вграждате файлове/ресурси директно в exe и да ги четете във вашия код, сякаш от диск. Можете да вградите вашите звукови файлове по този начин. Това обаче значително ще увеличи размера на вашия exe.

person Neil Kirk    schedule 03.09.2013
comment
Това обаче не работи прозрачно, така че библиотеката няма да може да отвори тези файлове. - person Vigabrand; 03.09.2013
comment
@Vigabrand Защо не? Просто ги заредете в масив от байтове. - person Neil Kirk; 04.09.2013
comment
char* се отнася до име на файл в API на Hekkus - person Vigabrand; 04.09.2013
comment
@Vigabrand Не можах да намеря документацията на API на Hekkus, за да видя дали има алтернативни начини. - person Neil Kirk; 04.09.2013

Друг базиран на UNIX подход:

Променливата на средата LD_PRELOAD може да се използва за замяна на всяка споделена библиотека, с която е свързан изпълним файл. Всички символи, експортирани от библиотека, спомената в LD_PRELOAD, се разрешават в тази библиотека, включително извиквания към функции на libc като open, read и close. С помощта на libdl също е възможно библиотеката за обвиване да извика към оригиналната реализация.

И така, всичко, което трябва да направите, е да стартирате процеса, който използва звуковата система Hekkus в среда, която има подходящо зададен LD_PRELOAD, и можете да правите каквото искате с файла, който чете.

Имайте предвид обаче, че няма абсолютно никакъв начин да запазите данните недостъпни за потребителя: самият факт, че той трябва да може да ги чуе, означава, че трябва да има достъп. Дори ако целият софтуер във веригата ще използва криптиране и вашият потребител не желае да хакне хардуер, няма да е трудно да свържете аудио изходния жак с аудио входния жак, нали? И не можете да забраните на вашия потребител да използва слушалки, нали? И, разбира се, ядрото може да види целия аудио изход некриптиран и може да изпрати копие някъде другаде...

person cmaster - reinstate monica    schedule 03.09.2013
comment
Изглежда интересна опция, въпреки че трябва да поддържам и windows. Що се отнася до втората ви точка, звуците не се възпроизвеждат индивидуално, има музика и множество звуци, така че не би било много полезно. - person Vigabrand; 04.09.2013
comment
Въпреки че никога не съм правил подобно, мога да измисля методи за обратно инженерство на оригиналните звуци и те не са точно сложни... Но, разбира се, ако вашият музикален източник е доволен от оригиналните файлове, криптирани, и е също доволен от възможността за извличане на музиката така или иначе, изглежда, че няма проблем. Просто се уверете, че той не може да ви съди, когато музикалните файлове се появят в интернет... - person cmaster - reinstate monica; 04.09.2013

Решението на вашия проблем би бил ramdisk. http://en.wikipedia.org/wiki/RAM_drive Използване на част от паметта в ram като ако беше диск. Има наличен софтуер и за това. Кеширането на бази данни в ram става популярно.

И предпазва файла от диска, което би го направило лесно достъпен за потребителя.

person Peter Trypsteen    schedule 03.09.2013
comment
На Android? iPad? - person This isn't my real name; 03.09.2013
comment
Не бих искал наистина, ако игра или приложение добави нов диск към системата, докато работи. Освен това не знам дали има преносимо решение и вероятно ще изисква root/администраторски права. - person interjay; 03.09.2013
comment
Въпросът показва, че питащият е по-скоро в сайта за начинаещи в разработката. Внедряването на ramdisk не изглежда като правилен съвет. Освен това не знам ramdisk, който да е работещ независимо от платформата. - person Martin Schlott; 03.09.2013
comment
@Martin Schlott Hrm не е задължително LOL - person Vigabrand; 03.09.2013
comment
Не исках да те обидя. - person Martin Schlott; 03.09.2013