работает в Xp не работает Windows 7

Тема в разделе "Другие", создана пользователем Firefox, 11 апр 2011.

  1. Firefox

    Firefox Гость

    Здравствуйте такая у меня проблема. перенесла свой проект с Windows XP на Windows 7 и перестала работать функция считывающая данные со звукового файла. а именно строчка
    Код (C++):
    file.read(pData,dwDataSize);
    возвращает пустую pData, хотя размер dwDataSize огромное значение. в Windows XP(на нем разрабатывалась программа) все данные считываются правильно.
    в чем может быть ошибка. или как по другому считать в массив данные. эту часть программы мне помогали написать на этом форуме, может подскажете и как эту проблемку решить.
    Код (C++):
    setlocale(LC_ALL,"Russian"); //Локаль
    ::DirectSoundCreate8(0,&pDirectSound,NULL); //Использовать будем 8-е иксы
    pDirectSound->SetCooperativeLevel(::GetForegroundWindow(),DSSCL_NORMAL); //Закажем уровень доступа как стандартный


    ifstream file(/*"D:\\Sounds\\Iskaz0\\Sound5.wav"*/File_name_record,ios::beg | ios::in|ios::binary); //Наша wav'ка
    if (!file)
    {
    QMessageBox::warning(0,"error","error open file");
    return false;
    }

    DWORD dwRIFF = 0; //И так идет формат wav-файла, он относится к RIFF-файлам, поэтому читаем 4 байта структуы
    file.read((char*) &dwRIFF,4);
    if (dwRIFF != MAKEFOURCC('R','I','F','F')) //Если RIFF не получили, то значит какую то залепу открыли
    {
    cout<<"Файл не является RIFF - formated"<<endl;
    return false;
    }

    file.ignore(4); //Пропустим 4 байта там какая то охинея нам совершенно не нужна
    DWORD dwWave = 0; //Секция WAVE
    DWORD dwFormat = 0; // Секция fmt /формат файла/
    long lSizeFmt = 0; //Размер секции fmt

    file.read((char*)&dwWave,4); //Читаем 4 байта, там для Wav-файла должно быть название секции WAVE
    if (dwWave != MAKEFOURCC('W','A','V','E')) //Проверим
    {
    cout<<"Файл не имеет секции WAVE"<<endl;
    return false;
    }

    file.read((char*)&dwFormat,4); //Если все ОК... То читаем
    if (dwFormat != MAKEFOURCC('f','m','t',' ')) //Если секция fmt - не найдена
    {
    cout<<"Файл не имеет Format(fmt)-Секции "<<endl;
    return false;
    }
    file.read((char*)&lSizeFmt,4); //Еще читаем 4 байта, там у нас размер секции формат, где идет сам формат + может идти всякая охинея, формат лежит в 16 байтах
    WAVEFORMATEX WaveFormat = WAVEFORMATEX(); //Определим структуру винды
    file.read((char*)&WaveFormat,16); //Прочитаем ее
    file.ignore(lSizeFmt-16); //Пропустим охинею
    if (WaveFormat.wFormatTag != 1) //Если таг <>1 то значит есть компрессия файла, ее разбирать мы не будем, работаем не с жатыми данными
    {
    cout<<"Файл имеет компрессию"<<endl;
    return false;
    }

    DWORD dwSection = 0; //Следующая секция у нас или fact(Не обязательная) или data(это как раз наш звук)
    DWORD dwSizeFact = 0;
    file.read((char*)&dwSection,4); //Читаем заголовок
    if (dwSection == MAKEFOURCC('f','a','c','t')) //Если все же fact - то пропускаем ее
    {
    cout<<"Файл имеет секцию fact"<<endl;
    file.read((char*)&dwSizeFact,4);
    file.ignore(dwSizeFact);
    file.read((char*)&dwSection,4);
    }

    if (dwSection != MAKEFOURCC('d','a','t','a')) //Ну а теперь сама data - это то, над чем мы будем работать
    {
    cout<<"Не найдена секция data"<<endl;
    return false;
    }
    DWORD dwDataSize =0;
    file.read((char*)&dwDataSize,4); //Прочитаем ее размер
    char *pData = new char[dwDataSize]; //Динамически выделим переменную типа char[размер звуковых данных]

    file.read(pData,dwDataSize); //Прочитаем в нее все звуковые данные
    file.close(); //Закроем файл, он нам уже не нужен, у нас есть pData
    вот код полностью считывания звуковых данных из файла.
     
  2. Hryv

    Hryv Гость

    Windows 7 64-разрядная?
    давно не программировал на c++, но есть предположение, что трабл где-то в том, что dwDataSize объявлена как DWORD

    перепроверьте тип второго параметра file.read()

    и, кстати, file.read((char*)&dwDataSize,4) пишет в dwDataSize 4 байта
    возможно, что в 64-разрядной Windows 7 DWORD не 32, а 64 бита, тогда вы вместо реального размера получаете намного большее число
    то есть вместо шестнадцатиричного числа ХХХХ у вас в dwDataSize образуется ХХХХ0000

    ЗЫ возможно все что я написал - ахинея, но проверить это не долго, вдруг поможет
     
  3. Firefox

    Firefox Гость

    спасибо за совет)исправила формат записываемых данных. почему-то в 7кеэтот не распознавался.
     
Загрузка...

Поделиться этой страницей