Название: Звук не воспроизводиться
Отправлено: Firefox от Январь 26, 2010, 14:45
Здравствуйте. не могу открыть звуковой файл, ни какой ошибки не пишет, но и не открывает. путь указа верно HMMIO hmmio; char name1[54]="E:\\CVIAZ\\Копия CVIAZ_rez\\CVIAZ_V\\cviaz_v\\zap_op.wav"; if(hmmio=mmioOpen((LPWSTR)name1, NULL,MMIO_EXIST |MMIO_READ)) ui.edit_Peredano_2->setText("OK"); else ui.edit_Peredano_2->setText("BADE"); if(mmioSeek(hmmio,0L,SEEK_END<0)ui.edit_P_Vremya_2->setText(str.sprintf("%d",mmioSeek(hmmio,0L,SEEK_END))); else ui.edit_P_Vremya_2->setText("=0"); помемтить путь прямо в функцию не могу, выдаёт ошибку о несовпадении типов а 1 аргументе функции mmioOpen. хотя в книжках так и пишется.
Название: Re: Звук не воспроизводиться
Отправлено: niXman от Январь 26, 2010, 15:45
http://msdn.microsoft.com/en-us/library/dd757331%28VS.85%29.aspx
какая ошибка?
Название: Re: Звук не воспроизводиться
Отправлено: Firefox от Январь 26, 2010, 16:47
В таком варианте HMMIO hmmio; char *name1="E:\\CVIAZ\\Копия CVIAZ_rez\\CVIAZ_V\\cviaz_v\\zap_op.wav"; if(hmmio=mmioOpen(name1, NULL,MMIO_EXIST |MMIO_READ)) ui.edit_Peredano_2->setText("OK"); else ui.edit_Peredano_2->setText("BADE"); if(mmioSeek(hmmio,0L,SEEK_END<0)ui.edit_P_Vremya_2->setText(str.sprintf("%d",mmioSeek(hmmio,0L,SEEK_END))); else ui.edit_P_Vremya_2->setText("=0"); выдает ошибку:error C2664:'mmioOpenW': cannotconvert parametr 1 from 'char*' to LPWSTR если в строке if(hmmio=mmioOpen((LPWSTR)name1, NULL,MMIO_EXIST |MMIO_READ)) добавить принудительно этот тип данных ошибка проходит, но файл не открывается.
Название: Re: Звук не воспроизводиться
Отправлено: niXman от Январь 26, 2010, 17:06
char *name1="E:\\CVIAZ\\Копия CVIAZ_rez\\CVIAZ_V\\cviaz_v\\zap_op.wav"; C++ (Qt) LPWSTR name1="E:\\CVIAZ\\Копия CVIAZ_rez\\CVIAZ_V\\cviaz_v\\zap_op.wav";
Название: Re: Звук не воспроизводиться
Отправлено: crackedmind от Январь 27, 2010, 13:47
char *name1="E:\\CVIAZ\\Копия CVIAZ_rez\\CVIAZ_V\\cviaz_v\\zap_op.wav"; C++ (Qt) LPWSTR name1="E:\\CVIAZ\\Копия CVIAZ_rez\\CVIAZ_V\\cviaz_v\\zap_op.wav";
не верно :) LPWSTR name1=L"E:\\CVIAZ\\Копия CVIAZ_rez\\CVIAZ_V\\cviaz_v\\zap_op.wav"; Либо в настройках проекта сменитью Юникод на мульти байт.
Название: Re: Звук не воспроизводиться
Отправлено: Firefox от Январь 27, 2010, 20:43
Спаибо помогло, по крайне мере открывает. Дальше у меня ещё проблемы возникли. проверяю наличие блока WAVE, совершенно точно знаю что он там есть(пробовала в готовом аналоге проверять исходный файл) но программа моя утверждает обратное. так же он не находит ни блока data ни блока fmt. совершенно не знаю почему
Название: Re: Звук не воспроизводиться
Отправлено: Firefox от Январь 27, 2010, 20:48
вот код WAVEFORMATEX* wfx; // Указатель на объект структуры WAVEFORMATEX HMMIO m_hmmioIn; // Мультимедийный дескриптор файла MMCKINFO m_ckIn; // Инфоромация о вложенном блоке формата RIFF MMCKINFO m_ckInRiff; // Используется при открытии аудио файла DWORD dwDataSize; // РАЗМЕР ВЛОЖЕННОГО БЛОКА ДАННЫХ HPSTR lpData; //указатель на вложенный блок данных LPWSTR File_Name=L"zap_op.wav"; m_hmmioIn=mmioOpen(File_Name, NULL,MMIO_ALLOCBUF|MMIO_READ); if(m_hmmioIn!=NULL) ui.text2_4->setText("OK"); else ui.text2_4->setText("BADE"); ui.edit_P_Vremya_2->setText(str.sprintf("%d",mmioSeek(m_hmmioIn,0L,SEEK_END))); m_ckIn.fccType = mmioFOURCC( 'W', 'A', 'V', 'E'); if (mmioDescend(m_hmmioIn, (LPMMCKINFO) &m_ckIn, NULL, MMIO_FINDRIFF)!=NULL) { ui.text2_4->setText("ther is no wave file"); mmioClose( m_hmmioIn, NULL ); return 0; } // Установка текущей позиции файла на начало блока данных m_ckIn.ckid = mmioFOURCC('d', 'a', 't', 'a'); m_ckInRiff.fccType = NULL; if (mmioDescend(m_hmmioIn, &m_ckIn, &m_ckInRiff, MMIO_FINDCHUNK)!=NULL) { ui.text2_4->setText("ther is no data chuck in file"); } dwDataSize=m_ckInRiff.cksize; if (dwDataSize==0L) { ui.text2_4->setText("data=0"); } if (mmioRead(m_hmmioIn,(HPSTR) lpData,dwDataSize )!=dwDataSize) { ui.text2_4->setText("error in reading"); }
Название: Re: Звук не воспроизводиться
Отправлено: Firefox от Январь 28, 2010, 22:56
я задолбалась искать почему функция mmioDescened не находит блоки в wave файле. и я вот сделала всё по кустарному. в общем идея такая открываю файл wave в двоичном виде, считываю информацию и записываю в txt файл. потом в нём нахожу блок data и всё что после него считать надо в массив char. но вот проблема массив получается офигенно большой и программа breik делает. тогда я вот решила так считывать из фаула скажем по 128 бит преобразовывать их(мне надо добавить в исходный файл шум) создать новый файл и в него записать начало из txt файла до блока data то же а потом по 128 бит исправленных. вот только пока не сделаа считывание по 128 бит - изменение - запись. не очень с потоками лажу. может кто описать этот кусочек. буду благодарна
Название: Re: Звук не воспроизводиться
Отправлено: BRE от Январь 28, 2010, 23:04
Для чего эта строка: C++ (Qt) ui.edit_P_Vremya_2->setText(str.sprintf("%d",mmioSeek(m_hmmioIn,0L,SEEK_END)));
По логике mmioSeek устанавливает смещение на конец файл, поэтому все последующие операции ничего найти не могут. Это IMHO, с вендой давно не дружу. :)
Название: Re: Звук не воспроизводиться
Отправлено: Firefox от Январь 28, 2010, 23:19
да и без этой строки тоже не находит. это потом дописала как одну из вариации, стереть забыла
Название: Re: Звук не воспроизводиться
Отправлено: BRE от Январь 28, 2010, 23:28
Полез в msdn. Попробуй проверять результат выполнения mmioDescend с помощью специально определенных значений: MMSYSERR_NOERROR MMIOERR_CHUNKNOTFOUND
Возможно проверка на != NULL просто не корректна.
Название: Re: Звук не воспроизводиться
Отправлено: crackedmind от Январь 29, 2010, 09:25
хех, а вот у меня с mmioSeek ничерта не находит, без нее все ок :)
Название: Re: Звук не воспроизводиться
Отправлено: Firefox от Январь 29, 2010, 10:02
теперь останавливается на блоке последнем. ошибка в чтении. спасибо,это прогресс уже))
Название: Re: Звук не воспроизводиться
Отправлено: BRE от Январь 29, 2010, 10:13
теперь останавливается на блоке последнем. ошибка в чтении. спасибо,это прогресс уже))
В смысле на mmioRead? Что возвращает она функция? И еще вопрос, а где выделяется память для буфера, куда происходит чтение (lpData)?
Название: Re: Звук не воспроизводиться
Отправлено: Firefox от Январь 30, 2010, 23:39
Вот написала 2 функции, более правильные на мой взгляд WAVEFORMATEX* wfx; // Указатель на объект структуры WAVEFORMATEX HMMIO m_hmmioIn; // Мультимедийный дескриптор файла HMMIO m_hmmioOut; // Мультимедийный дескриптор файла MMCKINFO m_ckIn; // Инфоромация о вложенном блоке формата RIFF MMCKINFO m_ckInRiff; // Используется при открытии аудио файла DWORD dwDataSize; // РАЗМЕР ВЛОЖЕННОГО БЛОКА ДАННЫХ HPSTR lpData; //указатель на вложенный блок данных MMIOINFO mmioinf; MMCKINFO ckOutRIFF; MMCKINFO ckOut; MMIOINFO mmioinfoOut; PCMWAVEFORMAT pcmWaveFormat; #define N2 22050 bool cviaz_v:: sound_volum() { LPWSTR File_Name=L"zap_op.wav"; BYTE y_byte_1[N2*4],y_byte[N2*4]; int sh_byte_3=0; WORD prom10; WORD x_sh[2*N2]={0,}; long lSamples; // number of samples m_hmmioIn=mmioOpen(File_Name, NULL,MMIO_ALLOCBUF|MMIO_READ); if(m_hmmioIn!=NULL) ui.edit_Peredano_2->setText("OK"); else ui.edit_Peredano_2->setText("BADE"); //ui.edit_P_Vremya_2->setText(str.sprintf("%d",mmioSeek(m_hmmioIn,0L,SEEK_END))); m_ckIn.fccType = mmioFOURCC( 'W', 'A', 'V', 'E'); if (mmioDescend(m_hmmioIn, (LPMMCKINFO) &m_ckIn, NULL, MMIO_FINDRIFF)!=NULL) { ui.edit_Peredano_2->setText("ther is no wave file"); //mmioClose( m_hmmioIn, NULL ); //return 0; } // Установка текущей позиции файла на начало блока данных m_ckIn.ckid = mmioFOURCC('d', 'a', 't', 'a'); m_ckInRiff.fccType = NULL; if (mmioDescend(m_hmmioIn, &m_ckIn, &m_ckInRiff, MMIO_FINDCHUNK)!=NULL) { ui.edit_Peredano_2->setText("ther is no data chuck in file"); } dwDataSize=m_ckIn.cksize; if (dwDataSize==0L) { ui.edit_Peredano_2->setText("data=0"); } int k=sizeof(lpData),priz_k=0; UINT cbDataIn = dwDataSize; start: if( 0 != mmioGetInfo( m_hmmioIn, &mmioinf, 0 ) )return 0; if( cbDataIn > m_ckIn.cksize ) { cbDataIn = m_ckIn.cksize; priz_k=1; } m_ckIn.cksize -= cbDataIn; for( DWORD cT = 0; cT < cbDataIn; cT++ ) { // Чтение информации из файла
if( mmioinf.pchNext == mmioinf.pchEndRead ) { if( 0 != mmioAdvance( m_hmmioIn, &mmioinf, MMIO_READ ) ) return 0;
if( mmioinf.pchNext == mmioinf.pchEndRead ) return 0;
}
// Копирование информации.
y_byte_1[sh_byte_3] = *((BYTE*)mmioinf.pchNext);
sh_byte_3++; mmioinf.pchNext++; } if(priz_k==1) { Reset(); if( 0 != mmioSetInfo( m_hmmioIn, &mmioinf, 0 ) ) return 0; cbDataIn = 4*N2-cbDataIn; priz_k=0; // str.Format("K=1 priz_k=%d,cbDataIn=%d,m_ckIn.cksize=%d,mmioinfoIn.pchEndRead =%d\n",priz_k,cbDataIn,m_ckIn.cksize,mmioinfoIn.pchEndRead ); // pr1.WriteString(str);
goto start; }
for( int i= 0; i < 4*N2; i=i+2 ) { prom10=0; prom10=y_byte_1[i+1]; prom10=prom10<<8; x_sh[i/2]=(prom10+(WORD)y_byte_1[i]); y_byte[i+1]=(BYTE)(prom10>>8); }
if( 0!= mmioSetInfo( m_hmmioIn, &mmioinf, 0 ) ) return 0;
///////////write // Write the PCMWAVEFORMAT structure //---------------------------------------------- pcmWaveFormat.wf.wFormatTag=WAVE_FORMAT_PCM; pcmWaveFormat.wf.nChannels=1; pcmWaveFormat.wf.nBlockAlign=2; pcmWaveFormat.wf.nSamplesPerSec=N2; pcmWaveFormat.wf.nAvgBytesPerSec=N2*2; pcmWaveFormat.wBitsPerSample=16;
//---------------------------------------------- LPWSTR OutFile=L"zap_op_out.wav"; m_hmmioOut = mmioOpen(OutFile, NULL, MMIO_ALLOCBUF | MMIO_WRITE | MMIO_CREATE); for (int lSamples =2*N2; lSamples > 0; lSamples--) { if (mmioinfoOut.pchNext == mmioinfoOut.pchEndWrite) { mmioinfoOut.dwFlags |= MMIO_DIRTY; if (mmioAdvance(m_hmmioOut, &mmioinfoOut, MMIO_WRITE) != 0) QMessageBox::warning(0,"Error","error write file buffer"); } *(mmioinfoOut.pchNext)++ = y_byte_1[2*N2-lSamples] ; } if (m_hmmioOut == NULL){QMessageBox::warning(0,"Error","error open out file"); return 0;} ckOutRIFF.fccType = mmioFOURCC('W', 'A', 'V', 'E'); if (mmioCreateChunk(m_hmmioOut, &ckOutRIFF, MMIO_CREATERIFF) != 0) {QMessageBox::warning(0,"Error","error create chuck wave in out file");return 0;} ckOut.ckid = mmioFOURCC('f', 'm', 't', ' '); if (mmioCreateChunk(m_hmmioOut, &ckOut, 0) != 0) QMessageBox::warning(0,"Error","error create chuck fmt in out file");
if (mmioWrite(m_hmmioOut, (HPSTR) &pcmWaveFormat, sizeof(pcmWaveFormat))!= sizeof(pcmWaveFormat)) QMessageBox::warning(0,"Error","cant write new file"); if (mmioAscend(m_hmmioOut, &ckOut, 0) != 0)QMessageBox::warning(0,"Error","in writing");
ckOut.ckid = mmioFOURCC('d', 'a', 't', 'a'); if (mmioCreateChunk(m_hmmioOut, &ckOut, 0) != 0)QMessageBox::warning(0,"Error","error create chuck data in out file");
if (mmioGetInfo(m_hmmioOut, &mmioinfoOut, 0) != 0)QMessageBox::warning(0,"Error"," end error");
} HRESULT cviaz_v::Reset() { // Поиск начала информации if( mmioSeek( m_hmmioIn, m_ckInRiff.dwDataOffset + sizeof(FOURCC), SEEK_SET ) < 0) return 0;
// Поиск во входном файле блока 'data'. m_ckIn.ckid = mmioFOURCC('d', 'a', 't', 'a');
if( mmioDescend( m_hmmioIn, &m_ckIn, &m_ckInRiff, MMIO_FINDCHUNK ) != 0) return 0;
return S_OK; } создаётся новый wav файл, но что-то в нём не так, он не воспроизводиться. windows media player пишет что неизвестный формат. вот не могу пока что понять где я ошибаюсь.
Название: Re: Звук не воспроизводиться
Отправлено: BRE от Январь 31, 2010, 12:50
Набросал небольшой пример, который читает и пишет WAV-файл. Боевой код можно сделать проще, сейчас пытался расписать все в деталях. Посмотри, попробуй. Когда разберешься, переделать код для mmio труда не составит. C++ (Qt) // Код демонстрационный! // Код подразумевает, что архитектура использует byte order == little endian. // При записи ошибки не проверяются, лениво стало. :) #include <QByteArray> #include <QFile> #include <QtEndian> #include <QDebug> #define SIG_RIFF quint32(('R' << 24) | ('I' << 16) | ('F' << 8) | ('F')) #define SIG_WAVE quint32(('W' << 24) | ('A' << 16) | ('V' << 8) | ('E')) #define SIG_FMT quint32(('f' << 24) | ('m' << 16) | ('t' << 8) | (' ')) #define SIG_DATA quint32(('d' << 24) | ('a' << 16) | ('t' << 8) | ('a')) #pragma pack(push, 1) struct WAVFormat { quint16 formatTag; // тип формата quint16 channels; // количество каналов (1 - моно или 2 - стeрео) quint32 samplesPerSec; // частота дискретизации (11025, 22050, 44100, ...) quint32 avgBytesPerSec; // скорость потока данных quint16 blockAlign; // выравнивание блока данных quint16 bitsPerSample; // количество бит в сеймпле }; #pragma pack(pop) static bool findSig( QIODevice *dev, quint32 sig ) { Q_ASSERT( dev ); qDebug() << "Search signature :" << hex << sig; while( !dev->atEnd() ) { quint32 data; if( dev->read( (char*)&data, sizeof( data ) ) != sizeof( data ) ) break; if( qToBigEndian( data ) == sig ) return true; } return false; } QByteArray readWav( QIODevice *dev, WAVFormat &fmt ) { if( !dev ) { qDebug() << "Device for reading is not specified"; return QByteArray(); } // Последовательно перемещаемся по сигнатурам RIFF, WAVE, fmt if( findSig( dev, SIG_RIFF ) && findSig( dev, SIG_WAVE ) && findSig( dev, SIG_FMT ) ) { // Читаем и проверяем размер блока fmt quint32 fmtSize; if( dev->read( (char*)&fmtSize, sizeof( fmtSize ) ) == sizeof( fmtSize ) && fmtSize == sizeof( fmt ) ) { // Читаем блок fmt if( dev->read( (char*)&fmt, sizeof( fmt ) ) == sizeof( fmt ) ) { // Перемещаемся к сигнатуре data if( findSig( dev, SIG_DATA ) ) { // Читаем размер данных quint32 dataSize; if( dev->read( (char*)&dataSize, sizeof( dataSize ) ) == sizeof( dataSize ) ) { // Читаем блок данных return dev->read( dataSize ); } } } } } qDebug() << "Format file error"; return QByteArray(); } bool writeWav( QIODevice *dev, const WAVFormat &fmt, const QByteArray &data ) { quint32 sig; quint32 size; if( !dev ) { qDebug() << "Device for writing is not specified"; return false; } // Пишем сигнатуру RIFF sig = qToBigEndian( SIG_RIFF ); dev->write( (char*)&sig, sizeof( sig ) ); // Вычисляем и записываем размер блока RIFF size = sizeof(quint32) + // Сигнатура WAVE sizeof(quint32) + // Сигнатура fmt sizeof(quint32) + // Размер блока fmt (0x10) sizeof(fmt) + // Блок fmt sizeof(quint32) + // Сигнатура data sizeof(quint32) + // Размер данных data.size(); // Длина данных dev->write( (char*)&size, sizeof( size ) ); // Пишем сигнатуру WAVE sig = qToBigEndian( SIG_WAVE ); dev->write( (char*)&sig, sizeof( sig ) ); // Пишем сигнатуру fmt sig = qToBigEndian( SIG_FMT ); dev->write( (char*)&sig, sizeof( sig ) ); // Пишем размер блока fmt size = sizeof( fmt ); dev->write( (char*)&size, sizeof( size ) ); // Пишем блок fmt dev->write( (char*)&fmt, sizeof( fmt ) ); // Пишем сигнатуру data sig = qToBigEndian( SIG_DATA ); dev->write( (char*)&sig, sizeof( sig ) ); // Пишем размер data size = data.size(); dev->write( (char*)&size, sizeof( size ) ); // Пишем блок data dev->write( data ); return true; } int main( int, char ** ) { // Читаем файл QFile infile( "test.wav" ); if( !infile.open( QIODevice::ReadOnly ) ) { qDebug() << "File open error"; return 1; } WAVFormat fmt; QByteArray data = readWav( &infile, fmt ); qDebug() << fmt.formatTag << fmt.channels << fmt.samplesPerSec << fmt.avgBytesPerSec << fmt.blockAlign << fmt.bitsPerSample; // Пишем файл QFile outfile( "out.wav" ); if( !outfile.open( QIODevice::WriteOnly ) ) { qDebug() << "File create error"; return 1; } // Используем формат и данные прочитанного файла. // Если менять формат, то нужно настраивать параметры fmt и data. writeWav( &outfile, fmt, data ); return 0; }
Название: Re: Звук не воспроизводиться
Отправлено: Firefox от Февраль 01, 2010, 08:45
спасибо,буду пробовать))
Название: Re: Звук не воспроизводиться
Отправлено: Firefox от Февраль 03, 2010, 10:57
Со звуком всё разобрала, ещё раз благодарю. вот возникла другая проблемка. нужно чтобы по нажатию на кнопку громкость воспроизводимого файла(я его воспроизвожу с помощью QSound) менялась с каждым нажатием ну например уменьшалась. написала функцию void cviaz_v::volum(DWORD RightVolume) { LPDWORD level; HWAVEOUT id_pl; int m_DeviceID; WAVEOUTCAPS caps; switch(waveOutGetDevCaps((UINT)id_pl, &caps,sizeof(caps))) { case MMSYSERR_NOERROR: ui.text2_4->setText("1"); case MMSYSERR_BADDEVICEID: ui.text2_4->setText("2"); case MMSYSERR_NODRIVER : ui.text2_4->setText("3"); case MMSYSERR_NOMEM : ui.text2_4->setText("4");
} waveOutSetVolume(id_pl,0xFFFF-RightVolume);
} но функция waveOutGetDevCaps должна возвращать первое значение блока case а заходит по очерёдно во все остальные. тоесть по логике получается что нет устройств на компьютере для воспроизведения музыки. но это явно не верно.
Название: Re: Звук не воспроизводиться
Отправлено: Kolobok от Февраль 03, 2010, 12:24
В конце каждого блока case должен стоять break для выхода из switch.
Название: Re: Звук не воспроизводиться
Отправлено: Firefox от Февраль 03, 2010, 13:39
break я поставлю. но функция waveOutGetDevCaps от эторго работать не станет. при правильной работе она должна вернуть MMSYSERR_NOERROR, но именно это значение она и не возвращает.
Название: Re: Звук не воспроизводиться
Отправлено: crackedmind от Февраль 03, 2010, 14:14
Identifier of the waveform-audio output device. It can be either a device identifier or a Handle to an open waveform-audio output device.
у вас же никак не проинициализирован, т.е. устройство не открыто.
Название: Re: Звук не воспроизводиться
Отправлено: Firefox от Февраль 03, 2010, 21:07
да вот это я тоже заметила, но как проинициализировать не зняю.подскажите пожалуйста
Название: Re: Звук не воспроизводиться
Отправлено: BRE от Февраль 03, 2010, 21:15
да вот это я тоже заметила, но как проинициализировать не зняю.подскажите пожалуйста
А почему бы тебе не воспользоваться для этого Phonon'ом?
Название: Re: Звук не воспроизводиться
Отправлено: Firefox от Февраль 16, 2010, 09:09
void SetVolume(unsigned int SetVolume) { WAVEOUTCAPSA Woc;
DWORD Volume ;
if(waveOutGetDevCapsA(WAVE_MAPPER, &Woc, sizeof(Woc)) ==
MMSYSERR_NOERROR)
if(Woc.dwSupport && WAVECAPS_VOLUME == WAVECAPS_VOLUME)
waveOutSetVolume(0, SetVolume); }
если кому интересно вот функция для изменения громкости
|