Odczyt pliku wav

0

Napisałem program, który wczytuje plik wav korzystając z fragmentu artykułu : http://4programmers.net/C/Artyku%C5%82y/Odtwarzanie_i_rejestrowanie_d%C5%BAwi%C4%99ku_na_niskim_poziomie._II_%5BWinApi%5D%5BCBuilder%5D

jednak nie działa on w przypadku, gdy w pliku wav są dodatkowe bloki opcjonalne pomiędzy fmt a data. Jak napisać warunek, który sprawdzi czy takie bloki istnieją??

0

Niedawno podawałem link z opisem formatu wav. A jeżeli chodzi o bloki to czytasz nagłówki

struct chunk
{
   char fourCC[4];
   DWORD cbSize; //<--- nie licząc sizeof(chunk)
}

sprawdzasz czy fourCC jest 'data'. Jeśli nie, to przesuwasz wskaźnik odczytu o cbSize bajtów i powtarzasz całą operację do skutku.

PS. nagłówek 'fmt ' też powinien być tak odczytywany, bo nie zawsze ma on 16 bajtów (tylko WAVE_FORMAT_PCM i WAVE_FORMAT_IEEE_FLOAT).

0

strcmp(tab,"RIFF")

0

sprawdzasz czy fourCC jest 'data'. Jeśli nie, to przesuwasz wskaźnik odczytu o cbSize bajtów i powtarzasz całą operację do skutku

czy chodzi o takie cos??

char* wsk = chunk.fourCC;
        while(1)
        {
                if(chunk.fourCC != "data")
                {
                wsk+=chunk.cbSize;
                }
                break;
        }

wydaje mi sie to dobry kod, ale nie dziala...

0

raczej o cos w stylo strcmp() ;]

no i petla tak jakos w ogole bez sensu...
juz predzej:

while(1){
if(...)
break;
wsk..
}

0

Jak już to:

while(...)
{
	chunk*  pch=(chunk*)wsk;
	wsk+=sizeof(chunk);

	if(memcmp(pch->fourCC,"fmt ",4)==0)
	{
		//wsk wskazuje na format
	}
	else if(memcmp(pch->fourCC,"data",4)==0)
		{
			//wsk wskazuje na sample
		}

	wsk+=pch->cbSize;
}

PS. użyj ifstream.

1 użytkowników online, w tym zalogowanych: 0, gości: 1