Dobry den, ahoj...
prave podleham tezkym depresim, za vsim stoji nefunkcnost meho programu...
Vytvoril jsem pomerne jednoduchy synthetiser operujici na consoly, vyuzivajici knihovnu libsndfile.
Program ziskava data pro synthesu zvuku z textoveho souboru, ktery predtim musi uzivatel vytvorit (kdo jiny...ve skutecnosti jsem take vytvoril GUI pro formatovani tohoto *.txt, protoze obsahuje mnoho a mnoho udaju).
Kazdy radek obsahuje dulezite informace o zvuku (frekvenci, amplitudu, dobu trvani, udaje o FM, AM a Additive synthese, efekty, obalky...proste vsechno). Pro kazdy nacteny radek program provede operacni smycku, ktera vytvori *.wav s odpovidajicimi parametry. Na konci tohoto procesu je tedy vytvoreno stejne mnozstvi *.wav, jako je radku v *.txt souboru. Zvukove soubory jsou pojmenovany podle cisla radku v textovem souboru, na jehoz zaklade byly vypocitany. Wav soubory se lisi pouze ve sve delce, ne sampling rate, poctu kanalu, atd...Toto vse funguje bez problemu. Kompilator nehlasi zadna varovani, console nepada, vytvorene zvukove soubory odpovidaji parametrum z textoveho souboru. Ted bych mel jasat, ze je uz jen staci smichat do jedineho souboru a nadbytecne soubory vymazat...Hm, nejasam. Mam problem se smyckou, ktera by mela nacitat jedotlive zvukove soubory a jeden po druhem je zapisovat na konec konecneho vystupniho souboru. Pravdepodobne spatne pouzivam funkci sf_seek() - stale ziji v domeni, ze jeji tvurce ECdeL...ma pravdu, kdyz tvrdi: pouzijeli se sf_seek() samostatne pozmeni i nasledujici sf_write() funkci...mozna ale take delam chybu v operovani s pameti...urcite delam chybu v tom, ze micham c s c++, ale programuji teprve necelych sest mesicu a tak to jinak vlastne neumim, pardon, proto taky tato "stupidni" otazka. Toto je relevantni cast kodu se kterou mam problem. Nezapisuje soubory na konec vystupu, jak bych si pral, ale prepisuje je pres sebe. Zkousel jsem i jine varianty, ale nic kloubneho z toho nebylo...
...zde v mem kodu konci vytvareni souboru a cteni txt
|
v
for(int i=0; i<n; i++)
{
char b[10];
itoa(i, b, 10 );
char NAMEIN[8] = {b[0], '.', 'w', 'a', 'v'};
psfinfoin = (SF_INFO *) malloc(sizeof(SF_INFO));
psfinfoout = (SF_INFO *) malloc(sizeof(SF_INFO));
if(!(psfin = soundin_open(NAMEIN, chans, sr)))
{
cout << "error opening output file\n" << NAMEIN << endl;
exit(-1);
}
else cout << "soubor " << NAMEIN << " uspesne otevren pro cteni" << endl;
buffer1= new float [def_len];
if(!(psfout = soundout_open("out.wav")))
{
cout << "error opening output file\n" << endl;
exit(-1);
}
else cout << "soubor <out.wav> otevren pro psani" << endl;
do
{
sf_seek(psfout, 0, SEEK_END);
count1 = sf_readf_float(psfin, buffer1, def_len);
sf_writef_float(psfout, buffer1, count1);
}
while(count1);
soundin_close(psfin);
soundout_close(psfout);
free(psfinfoin);
free(psfinfoout);
free(buffer1);
}
|
v
nasleduje cast kodu, ktera vymaze vse zbytecne, tak, aby zustal jen jediny zvukovy soubor <out.wav> a kod je uzavren
...integer n ve smycce je pocet vsech zvukovych souboru zvetseni o jednu, def_len ma velikost 1024...
Budu vdecny za jakoukoli pripominku, nebo navrh ohledne tohoto problemu, idelni by vsak bylo, kdybych mohl nekomu podekovat za uverejneni kodu, ktery ukazuje jak zapsat jeden zvukovy soubor na konec jineho.
Dekuji mnohokrat...
kristian
Fórum › C / C++
Libsndfile-jak smichat libovolny pocet zvukovych souboru ve smycce?
To kristian :
Problem vyresen za pomoci uzivatele alwaysLearning z go4expert.com.
problem byl v otevirani a zavirani vystupu uvnitr loopu...ten se pak plnil vzdy jen jednou...jsem to ale hlupak...Inkriminovane misto nyni vypada takto:
.
.
.
.
if(!(psfout = soundout_open("out.wav")))
{
cout << "error opening output file\n" << endl; exit(-1);
}
else cout << "file <out.wav> opened for writing" << endl;
for(int inte=0; inte<nn; inte++)
{
char b[1];
itoa(inte, b, 10 );
char NAMEIN[8] = {b[0], 'i', 'n', '.', 'w', 'a', 'v'};
buffer1= new float [def_len];
if(!(psfin = soundin_open(NAMEIN, chans, sr)))
{
cout << "error opening output file\n" << NAMEIN << endl; exit(-1);
}
else cout << "soubor " << NAMEIN << " uspesne otevren pro cteni" << endl;
do {
//sf_seek(psfout, 0, SEEK_END);
count1 = sf_readf_float(psfin, buffer1, 1024);
sf_writef_float(psfout, buffer1, count1);
}
while(count1);
soundin_close(psfin);
free(psfinfoin);
free(buffer1);
}
soundout_close(psfout);
free(psfinfoout);
.
.
.
.
a funguje....
zivot je hnedle hezci
k
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Libovolný počet znaků nebo nic — založil fix
Kopírování souborů-libovolný formát — založil Anonymní uživatel
Libovolný soubor + koncovka souboru — založil FreakLej
Počet souborů ve složce — založil Paja2
Příkaz na počet souborů — založil Lily
Moderátoři diskuze