Russian Qt Forum
Ноябрь 24, 2024, 14:31 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Звук не воспроизводиться  (Прочитано 13417 раз)
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. хотя в книжках так и пишется.
Записан
niXman
Гость
« Ответ #1 : Январь 26, 2010, 15:45 »

http://msdn.microsoft.com/en-us/library/dd757331%28VS.85%29.aspx

какая ошибка?
Записан
Firefox
Гость
« Ответ #2 : Январь 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))  добавить принудительно этот тип данных ошибка проходит, но файл не открывается.
Записан
niXman
Гость
« Ответ #3 : Январь 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";
 
Записан
crackedmind
Гость
« Ответ #4 : Январь 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";

Либо в настройках проекта сменитью Юникод на мульти байт.
Записан
Firefox
Гость
« Ответ #5 : Январь 27, 2010, 20:43 »

Спаибо помогло, по крайне мере открывает.
Дальше у меня ещё проблемы возникли. проверяю наличие  блока WAVE, совершенно точно знаю что он там есть(пробовала в готовом аналоге проверять исходный файл) но программа моя утверждает обратное.
так же он не находит ни блока data ни блока fmt. совершенно не знаю почему
« Последнее редактирование: Январь 27, 2010, 20:47 от Firefox » Записан
Firefox
Гость
« Ответ #6 : Январь 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");
}
Записан
Firefox
Гость
« Ответ #7 : Январь 28, 2010, 22:56 »

я задолбалась искать почему функция mmioDescened не находит блоки в wave файле. и я вот сделала всё по кустарному. в общем идея такая открываю файл wave в двоичном виде, считываю информацию и записываю в txt файл. потом в нём нахожу блок data и всё что после него считать надо в массив char. но вот проблема массив получается офигенно большой и программа breik делает. тогда я вот решила так считывать из фаула скажем по 128 бит преобразовывать их(мне надо добавить в исходный файл шум) создать новый файл и в него записать начало из txt файла до блока data то же а потом по 128 бит исправленных. вот только пока не сделаа считывание по 128 бит  - изменение - запись. не очень с потоками лажу. может кто описать этот кусочек. буду благодарна
Записан
BRE
Гость
« Ответ #8 : Январь 28, 2010, 23:04 »

Для чего эта строка:
Код
C++ (Qt)
ui.edit_P_Vremya_2->setText(str.sprintf("%d",mmioSeek(m_hmmioIn,0L,SEEK_END)));

По логике mmioSeek устанавливает смещение на конец файл, поэтому все последующие операции ничего найти не могут.
Это IMHO, с вендой давно не дружу.  Улыбающийся
Записан
Firefox
Гость
« Ответ #9 : Январь 28, 2010, 23:19 »

да и без этой строки тоже не находит. это потом дописала как одну из вариации, стереть забыла
Записан
BRE
Гость
« Ответ #10 : Январь 28, 2010, 23:28 »

Полез в msdn.
Попробуй проверять результат выполнения mmioDescend с помощью специально определенных значений:
MMSYSERR_NOERROR
MMIOERR_CHUNKNOTFOUND

Возможно проверка на != NULL просто не корректна.
Записан
crackedmind
Гость
« Ответ #11 : Январь 29, 2010, 09:25 »

хех, а вот у меня с mmioSeek ничерта не находит, без нее все ок Улыбающийся
Записан
Firefox
Гость
« Ответ #12 : Январь 29, 2010, 10:02 »

теперь останавливается на блоке последнем. ошибка в чтении. спасибо,это прогресс уже))
Записан
BRE
Гость
« Ответ #13 : Январь 29, 2010, 10:13 »

теперь останавливается на блоке последнем. ошибка в чтении. спасибо,это прогресс уже))
В смысле на mmioRead? Что возвращает она функция?
И еще вопрос, а где выделяется память для буфера, куда происходит чтение (lpData)?
Записан
Firefox
Гость
« Ответ #14 : Январь 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 пишет что неизвестный формат. вот не могу пока что понять где я ошибаюсь.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.284 секунд. Запросов: 21.