acmFormatChoose ACMERR_NOTPOSSIBLE WIESO? Experten



  • Hallo!
    Ich habe einen Audiorecorder geschrieben bei dem man zum Recorden den Codec bestimmen muss, das mach ich mit folgendem Code:

    ACMFORMATCHOOSE selCodec;
    	ZeroMemory(&m_Wave.m_pcmWaveFormat, sizeof(WAVEFORMATEX));
    	ZeroMemory(&selCodec, sizeof(selCodec));
    	selCodec.cbStruct = sizeof(selCodec);
    	selCodec.cbwfx = sizeof(WAVEFORMATEX);
    	selCodec.pwfx = &m_Wave.m_pcmWaveFormat;
    	selCodec.fdwStyle = 0;//ACMFORMATCHOOSE_STYLEF_INITTOWFXSTRUCT;
    
    	DWORD returns = acmFormatChoose(&selCodec);
    	if(returns != MMSYSERR_NOERROR)
    	{
    		if(returns == ACMERR_NOTPOSSIBLE)
    		{
    			MessageBox(0, theApp.GetText("The selected Codec doesn't support recording!"), 0, 0);
    		}
    }
    

    m_Wave.m_pcmWaveFormat ist vom Typ WAVEFORMATEX..
    ich versteh nicht dass ich da NOTPOSSIBLE bekomme...am Codec liegts nicht da wenn ich beim Audiorecorder den selben Codec auswähle alles funktioniert..die MSDN sagt nur

    ACMERR_NOTPOSSIBLE The buffer identified by the pwfx member of the ACMFORMATCHOOSE structure is too small to contain the selected format.
    

    Bitte helft mir..bin echt am verzweifeln!

    Kevin

    P.S.: Mit PCM funktioniert alles..nur alle anderen Codecs wollen nicht 😞



  • hola Surkevin

    dein problem ist WAVEFORMATEX. die codecs verwenden eine erweiterte version dieses structs. die sind zumeist groesser als WAVEFORMATEX.

    fuer die maximale groesse von WAVEFORMATEX deiner codecs verwendest am besten
    acmMetrics.
    wuerde ungefaehr so aussehen:

    unsigned int error = 0;
       unsigned int max_size = 0;
       error = acmMetrics(0,ACM_METRIC_MAX_SIZE_FORMAT,&max_size);
    

    Meep Meep



  • und wie soll ich das acmMetrics in Verbindung mit dem WAVEFORMATEX verwenden?

    Reicht es nicht wenn ich (habe ich vorhin gelesen) eine eigene WAVEFORMATEX Struktur mache, der ich dann noch 128Byte +- mehr Platz gebe? Wenn ich dann das WAVEFORMATEX zum Aufnehmen verwende..wird es dann überhaupt richtig im Codec aufgenommen oder fehlt dann noch was?

    Danke

    Kevin



  • struct TWAVEFORMATEX
    {
    	WAVEFORMATEX waveFormat;
    	BYTE byte[128];
    };
    

    DAmit tuts...aufnehmen kanners und abspielen ebenfalls 🙂



  • re

    probiers mal so:

    WAVEFORMATEX *wfx;
    ....
    unsigned int error = 0;
    unsigned int max_size = 0;
    error = acmMetrics(0,ACM_METRIC_MAX_SIZE_FORMAT,&max_size);
    char *temp = new char[max_size];
    wfx = (WAVEFORMATEX*)temp;
    

    wfx <- wird dann von acmFormatChoose richtig gefuellt. falls ich mich da jetz nicht verrannt habe.

    Meep Meep



  • mh auf "meine" Art gehts auch..gefällt sie dir nicht? 🙂 Ich denke im Grunde ist da kein großer Unterschied!



  • re

    ich hatte deinen letzten beitrag zu spaet gesehen, ansonsten haett ich mir den letzten post erspart. klar gehts mit deiner variante auch ;o)

    Meep Meep

    PS: alle codecs werden uebrigens nicht funktionieren. da musst du dann paar bytes von hand eingeben. ansonsten verweigern sie den dienst



  • mh verdammt..wenn ich jetzt mit den neu ausgewählten Codecs versuche aufzunehmen krieg ich immer die Exception dass der Codec aufnehmen nicht unterstützt? was jetzt? Mit PCM in höchster Quali aufnehmen und dann konvertieren? Aber wie konvertieren?

    grml

    Kevin



  • konvertieren machst mit den acmStream funktionen.

    Meep Meep



  • Weißt du was an dem Code falsch sein könnte?

    acmStreamPrepareHeader gibt MMSYSERR_INVALPARAM zurück 😞

    WAVEFORMATEX recorded
    	theMainFrame->GetAudioMgr()->MakeRecordFormat(&recorded);
    	ACMSTREAMHEADER streamheader;
    	if(acmStreamOpen(&phas,
    		0, &recorded,
    		//&recorded,
    		&theMainFrame->GetAudioMgr()->m_currentWaveFormat,
    		0,
    		0,
    		0,
    		0) != 0)
    	{
    		MessageBox(0, theApp.GetText("Error while converting!"), 0, 0);
    		return;
    	}
    
    	ZeroMemory(&streamheader, sizeof(ACMSTREAMHEADER));
    	DWORD iBufferLength = 0;
    	acmStreamSize(phas, m_Wave.m_buffer.GetNumSamples() * recorded.nBlockAlign,
    		&iBufferLength, ACM_STREAMSIZEF_SOURCE);
    	void* buffer = new BYTE[iBufferLength];
    	streamheader.cbStruct = sizeof(ACMSTREAMHEADER);
    	streamheader.fdwStatus = NULL;
    	streamheader.dwUser = 0;
    	streamheader.pbSrc = (unsigned char*)m_Wave.m_buffer.GetBuffer();
    	streamheader.cbSrcLength = m_Wave.m_buffer.GetNumSamples() * recorded.nBlockAlign;
    	streamheader.cbSrcLengthUsed = streamheader.cbSrcLength;
    	streamheader.dwSrcUser = 0;
    	streamheader.pbDst = (unsigned char*)buffer;
    	streamheader.cbDstLength = iBufferLength;
    	streamheader.cbDstLengthUsed = streamheader.cbDstLength;
    	streamheader.dwDstUser = 0;
    	//streamheader.dwReservedDriver = 0;
    
        HCURSOR hTemp = GetCursor();
    
    	::SetCursor(LoadCursor(::AfxGetInstanceHandle(),
    		MAKEINTRESOURCE(IDC_WAIT)));
    
    	if(acmStreamPrepareHeader(phas, &streamheader,
    		0) != 0)
    	{
    		MessageBox(0, theApp.GetText("Error while converting!"), 0, 0);
    		return;
    	}	
    
    	if(acmStreamConvert(phas, &streamheader, 0) != 0)
    	{
    		MessageBox(0, theApp.GetText("Error while converting!"), 0, 0);
    		return;
    	}
    
    	if(acmStreamUnprepareHeader(phas, &streamheader, 0) != 0)
    	{
    		MessageBox(0, theApp.GetText("Error while converting!"), 0, 0);
    		return;
    	}
    
    	::SetCursor(hTemp);
    
    	DeleteObject(hTemp);
    
    	m_Wave.SetBuffer(buffer, m_Wave.GetNumSamples(), TRUE);
    
    	delete buffer;
    

    recorded ist das Format mit dem aufgenommen wurde (PCM, Stereo, 22050Hz, 16)
    und m_currentFormat ist das in das konvertiert werden soll (PCM, Mono, 8000, 16)

    Die Samples bleiben ja mit dem Konvertieren gleich...ich denke der Rest von unbekanntem Code sollte am Namen erkennbar sein.

    Ich hoffe jemand kann nochmal helfen 😞

    Kevin



  • re

    ueberpruef nochmal acmStreamOpen. ich weiß nicht recht, ob man da den HACMDRIVER wirklich auf 0 setzen darf.

    Meep Meep



  • HI!
    Doch darf man, dann sucht er den richtigen raus...habs jetz hingekriegt, musste viel ändern. Was genau weiß ich nicht mehr, wenn sich jemand für den richtigen Code interessiert poste ich ihn.

    Kevin


Anmelden zum Antworten