Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > waveInAddBuffer ошибка NOMEM, как ее победить?


Автор: finomen 23.9.2008, 14:54
кто знает, подскажите, что неправльно в моем коде. цикл выполняется только 500 раз=(
программа позволяет выбрать устройство входа и выхода и должна просто транслировать звук....
собсно программа
Код

#include <iostream.h>
#include <windows.h>
#include <MMSYSTEM.H>
#include <MMREG.H>
#include <MSACM.H>

#pragma comment(lib, "winmm.lib")
void CALLBACK dmsg(HWAVE Handle,UINT Msg, DWORD Instance, DWORD Param1, DWORD Param2)
{
    switch(Msg)
    {
    case MM_WOM_OPEN: cout<<"Out dev opened"<<endl;
        break;
    case MM_WIM_OPEN: cout<<"In dev opened"<<endl;
        break;
    case MM_WOM_CLOSE: cout<<"Out dev closed"<<endl;
        break;
    case MM_WIM_CLOSE: cout<<"In dev closed"<<endl;
        break;
    default: cout<<"Dev event"<<endl;
        break;
    };

}
void main()
{
    char buf[1000];
    WAVEFORMATEX wfex;
    WAVEINCAPS wic;
    WAVEOUTCAPS woc;
    WAVEHDR whdr;
    MMTIME mmt;


    HWAVEIN hwi;
    HWAVEOUT hwo;


    wfex.wFormatTag=WAVE_FORMAT_PCM;
    wfex.nChannels=1;
    wfex.nSamplesPerSec=100;
    wfex.nAvgBytesPerSec=200;
    wfex.nBlockAlign=2;
    wfex.wBitsPerSample=16;
    wfex.cbSize=0;
    
    whdr.dwBufferLength=1000;
    whdr.lpData=buf;
    whdr.dwUser=0; //èãðîðèðóåòñÿ
    whdr.dwFlags=0;
    whdr.dwLoops=0;

    mmt.wType=TIME_MS;
    
    int t;
    cout<<"Num in devs: "<<(t=waveInGetNumDevs ())<<endl;
    for(int i=0;i<t;i++)
    {
        waveInGetDevCaps (i,&wic,sizeof(wic));
        cout<<i<<" - "<<wic.szPname<<endl;

    }
    cout<<"Num out devs: "<<(t=waveOutGetNumDevs ())<<endl;
    for(i=0;i<t;i++)
    {
        waveOutGetDevCaps (i,&woc,sizeof(woc));
        cout<<i<<" - "<<woc.szPname<<endl;

    }
    cout<<"Select In dev : ";
    cin>>t;

    t=0;
    if(waveInOpen (&hwi,t,&wfex,(DWORD)dmsg,NULL,CALLBACK_FUNCTION)!=0) cerr<<"Error opening dev"<<endl;

    cout<<"Select Out dev : ";
    cin>>t;
    if(waveOutOpen (&hwo,t,&wfex,(DWORD)dmsg,NULL,CALLBACK_FUNCTION)!=0) cerr<<"Error opening dev"<<endl;

    int f=0;    
    while(1)
    {
    if((t=waveInPrepareHeader(hwi,&whdr, sizeof(whdr)))!=0) 
    {
        cerr<<"Error in header prepearing "<<t<<endl;
        break;
    }
    if((t=waveInAddBuffer (hwi, &whdr, sizeof(whdr)))!=0)
    {
        cerr<<"Error adding input buffer "<<t<<endl;
        switch(t)
        {
        case MMSYSERR_NODRIVER: cerr<<"No driver"<<endl;
            break;
        case MMSYSERR_BADDEVICEID: cerr<<"No device"<<endl;
            break;
        case MMSYSERR_ALLOCATED: cerr<<"Oppend"<<endl;
            break;
        case MMSYSERR_NOMEM: cerr<<"No mem "<<whdr.dwBytesRecorded<<endl;
            break;
        }
        break;
        break;
    }
    waveInStart(hwi);
    while(!whdr.dwFlags==WHDR_DONE) {;}
        whdr.dwFlags=0;
    if((t=waveInUnprepareHeader(hwi,&whdr, sizeof(whdr)))!=0) 
    {
        cerr<<"Error in header unprepearing "<<t<<endl;
        break;
    }
    
    cout<<"Filtered "<<f<<endl;
    f++;
    if((t=waveOutPrepareHeader(hwo,&whdr, sizeof(whdr)))!=0)
    {    
        cerr<<"Error out header prepearing "<<t<<endl;
    }
    if((t=waveOutWrite (hwo, &whdr, sizeof(whdr)))!=0)
    {
        cerr<<"Error adding output buffer"<<endl;
        switch(t)
        {
        case MMSYSERR_NODRIVER: cerr<<"No driver"<<endl;
            break;
        case MMSYSERR_BADDEVICEID: cerr<<"No device"<<endl;
            break;
        case MMSYSERR_ALLOCATED: cerr<<"Oppend"<<endl;
            break;
        case MMSYSERR_NOMEM: cerr<<"No mem "<<whdr.dwBytesRecorded<<endl;
            break;
    }
    while(!whdr.dwFlags==WHDR_DONE) {;}
        whdr.dwFlags=0;
    if((t=waveOutUnprepareHeader(hwo,&whdr, sizeof(whdr)))!=0)
    {
        cerr<<"Error out header unprepearing "<<t<<endl;
        break;
    }
    }    
    
    waveInClose(hwi);
    waveOutClose(hwo);
    
}


это первая моя программа со звуком, так что сильно не бить

Автор: SVN74 29.9.2008, 23:00
поищи литературу О. Гордеева "Программирование Звука в Windows"

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)