Приветствую, господа! В целях самообразования, занимаюсь вытаскиванием музыки из демок(интро), которые используют для вывода музыки DirectSound (а кто его не использует В общем перехватил я в отладчике вызовы методов ->SetFormat ->Lock ->Unlock - По аргументам функции известно, где лежит буфер с музыкой и его размер. Дампим его!!! Потом присоединив стандартный wav заголовок к началу дампа и поправив некоторые поля (поля беруться из аргументов, переданных SetFormat) получаем wav-файл... Но, вместе с самой музыкой играется какой-то очень неприятный шум, точнее даже наоборот - на фоне шума играет музыка ;( Что делать...??? Ведь этот же трюк с API функциями типа waveOut*** (waveOutWrite) работал отлично...
Вот и я не пойму. Простейший способ вывода такой: Код (Text): void * write_cursor; unsigned long size; sound_buffer->Lock(soundbuffer_position, soundbuffer_chunk_size, &write_cursor, &size, 0, 0, 0); copy(write_cursor, &local_buffer, size); sound_buffer->Unlock(write_cursor, size, 0, 0); Видно же, что буфер содержит нужные данные. Может хитрая прога какая? ты не сравнивал то, что возвращает Lock с тем, что передаётся в Unlock?
Может и хитрая, но ведь в буфер то передаются данные определенного формата -> формат известен Посмотрел wav в SoundForge. Видно что непосредственно с музыкой периодически присутствуют пики (если судить по шкале то музыка где-то 20% а сами пики где-то 80%) Откуда они взялись??? Уже пришла идея интерполировать. Но не по дзенски как-то это. Должна же музыка быть в нормальном виде, и соответственно ее можно вытащить в этом нормальном виде.
Rustem Сам посуди - я вызываю IDirectSoundBuffer::Lock, получаю алрес (возможно 2) и размер блоков. Копирую туда "кусок" wav, потом делаю IDirectSoundBuffer::Unlock. Если ты его перехватишь - все данные твои. Другое дело, похоже, можно делать Unlock(0, 0, 0, 0) и музыка всё равно будет играть! Попробуй брать адреса кусков буфера именно из Lock. infern0 по правилам наверное, следует делать какой-то DirectShow фильр. а так - перехватывай IDirectDrawSurface::Lock - имееш данные (адрес и формат) поверхности, куда рендер рисует. Потом IDirectDrawSurface::Unlock - кадр лежит в памяти, делай что нужно Там COM, но адреса можно посмотреть в сайсе - ddraw!DD_Surface_Lock и ddraw!DD_Surface_Unlock4 (ещё есть ddraw!DD_Surface_Unlock, это старый интерфейс)
Все,сделал, работает!!!! Похоже глюк был в дампере (какой-то плагин к Olly) Написал свой, внедрил как длл и сдампил кусок. Все заработало отлично.
Rustem > Похоже глюк был в дампере (какой-то плагин к Olly) PETools, LordPE - "дамп регион" не устраивают?
Что-то я совсем забыл про них Сейчас пишу автоматический выдиратель музыки из приложений (Наверно только из демок\интро)