Народ, помогите прояснить ситуацию. Итак, написал прогу для конвертирования mp3 в wav. Прога использует библиотеку fmod. Проблема в том, что после конвертирования появляются щелчки и дефекты, примерно раз в 5-10 секунд. От файла не зависит, пробовал несколько. Код: Код (Text): FILE *f = fopen ("\\recdata.dat", "wb"); fwrite(&RIFF, sizeof(RIFF), 1, f); m_Progress.SetRange(0,sizemp3/(256*1024)); m_progress_info.SetWindowTextW(_T("Не дышать, идет процесс...")); m_progress_info.UpdateWindow(); for(i=0;i<1+sizemp3/(256*1024);i++) { samp = FSOUND_Sample_Load(FSOUND_FREE,mp3,FSOUND_2D,(256*1024)*i,(256*1024)); if(!samp) { break; } // Получаем доступ к звуковым данным в буфере звукового образца // Буфер имеет кольцевую структуру, поэтому задается двумя указателями. void *ptr1, *ptr2; unsigned int len1, len2; FSOUND_Sample_Lock(samp, 0, rec_len, &ptr1, &ptr2, &len1, &len2); fwrite(ptr1, len1, 1, f); if (len2) fwrite(ptr2, len2, 1, f); FSOUND_Sample_Unlock(samp, ptr1, ptr2, len1, len2); if (samp) FSOUND_Sample_Free(samp); m_Progress.SetPos(i); m_Progress.UpdateWindow(); } fclose(f); Почему в цикле? Потому что если засунуть весь файл одним махом, то памяти не хватает. Ее мало очень, мегов 30 свободно, а результат получается 50 с хвостиком, потому и сделал цикл. пробовал скармливать функции FSOUND_Sample_Load файл целиком, но меньшего размера, секунд на 30 - вроде бы щелчков не заметил, и памяти хватило. Так что есть подозрение, что все дело в цикле, вернее, в неверной его организации. Может быть, надо считывать кусочки не тупо одинакового размера, а по границам фреймов?
Проблема в том, что твой код одну аудиодорожку разбивает на несколько. В начале каждой аудиодорожки есть заголовок. Это и есть щелчок. Чем чаще будет выполняться цикл, тем чаще будешь слышать щелчки. По поводу памяти? ЧТо значит мегов 30? Почему нельзя сделать кэшфайл на диске? И обрабатывать единый поток.
Ой, виноват, не сказал - прога для pocketpc, отсюда и жесткие ограничения по памяти, там ее всего 64 мб, и половина забита всякой дрянью. Чтение и запись файла происходят с SD-карты. Если отдать этой функции весь файл сразу, то она говорит -not engouth memory, отсюда и пошла возня с циклом. Я пробовал портировать lame и др. - конвертит нормально, но ОЧЕНЬ медленно, 20-30 минут. Для оптимизации под арм не хватает мозга, потому и взял готовую либу.
Fmod же работает 1-2 минуты. Интересно, что за заголовки такие, вроде бы на выходе получаются raw-данные, заголовок wav я потом самостоятельно формирую и приляпываю в начало файла. Попробую писать каждый кусок в отдельный файл и проанализировать. Я так понимаю, что мое предположение насчет границ фреймов неверно?