acmFormatChoose ACMERR_NOTPOSSIBLE WIESO? Experten



  • 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