Название: работает не правильно в Windows 7 функция read
Отправлено: Firefox от Апрель 11, 2011, 10:39
Здравствуйте такая у меня проблема. перенесла свой проект с Windows XP на Windows 7 и перестала работать функция считывающая данные со звукового файла. а именно строчка file.read(pData,dwDataSize); возвращает пустую pData, хотя размер dwDataSize огромное значение. в Windows XP(на нем разрабатывалась программа) все данные считываются правильно. в чем может быть ошибка. или как по другому считать в массив данные. может подскажете и как эту проблемку решить. 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
Название: Re: работает не правильно в Windows 7 функция read
Отправлено: Пантер от Апрель 11, 2011, 10:54
Огромное - это какое? Может оно не верное?
Название: Re: работает не правильно в Windows 7 функция read
Отправлено: Firefox от Апрель 11, 2011, 11:26
2 милиона с чем-то. думаю если б оно было не верно функция возвращала бы false, а она возвращает true. и в XP все считывается верно и потом воспроизводится без проблем.
|