Dynamiczne tablice - prosze o rade

0

Jeszcze dlugo przy kazdym swoim topicu bede podkreslal, ze jestem poczatkujacy ;-)

No wiec. Wbrew wszelkim dostepnym bibliotekom audio poradzilem sobie sam z graniem wave'ow do roznych wyjsc kart audio w 100% synchronizacji co do sampla. Dla mnie szczypiorka to osiagniecie na miare epoki ;-)) Tym bardziej, ze ani BASS ani FMOD tego nie potrafia.

Mam klase, ktora jest playerem audio - do jednego wyjscia audio (np. moja karta ma ich 18 ;-) ) Chcialem dowolnie tworzyc sobie ilosc tych playerow - zrobilem sobie dynamiczna tablice. Po uruchomieniu decyduje ile tych playerow chce miec, inicjuje tablice (SetLength) i teraz w petli from Low(Tablica) to High(Tablica) inicjuje kazdy player - sa tam wszelkie operacje, typu przydzielanie wyjsc audio, inicjalizacja plikow audio itd. Po odtworzeniu zwalniam te playery - tez w tej petli. Moje pytanie dotyczy efektywnosci takiego sposobu w stosunku do wskaznikow - co jest bezpieczniejsze? Np. w sytuacjach, kiedy z jakiegos powodu program sie wywali? Czy te dynamiczne tablice w ogole sa dobrym pomyslem w takim zastosowaniu? Doradzcie poczatkujacemu...

Pozdrawiam,
Jacek

0

Słowo 'dynamiczne' mówi bardzo wiele. Tablicom takim przydziela się pamięc jak wskaźnikom. No cóż, jesli program się wywali, to niezależnie od typu danych i tak już będzie wywalony, więc nie ma to żadnego znaczenia. Poza tym, musiałbyś stworzyć listę albo tworzyć wskażnik do tablicy. Na jedno tak na prawdę wychodzi. Kwestia twojej wygody. I jeszcze jedno. Jeżeli program może sie wywalić, to zrób obsługę błędów i/lub wyjątków w krytycznych miejscach.

// do postu ponizej... Kiedy zwalniasz pamięć, to czy jest ona zwolniona?
// Do pq... Wydawało mi sie, że opis z helpa jest jednoznaczny, ale może sie mylę (albo help) :-).

0

Dzieki. Klasa tych playerow przechowuje w pamieci cale pliki audio. Czy zmiana rozmiaru tablicy powoduje automatycznie zwolnienie zasobow elementow, ktore juz sie w niej nie mieszcza?

Jacek

0

Czy zmiana rozmiaru tablicy powoduje automatycznie zwolnienie zasobow elementow, ktore juz sie w niej nie mieszcza?

Imho nie. Poprawne postępowanie to np.

Tablica[High(Tablica)].Free;  //zakladam ze nie trzeba wchodzic z Free w jakies podelementy
SetLength(Tablica,Pred(Length(Tablica)));

PS.: jak zrobiłeś synchronizację?

0

pq:

Jak zrobiłeś synchronizację?

Chyba najbanalniej jak sie dalo ;-) Nie wiem, dlaczego FMOD, czy BASS maja takie opoznienia. W klasie - playera wydzielilem niezaleznie inicjacje audio, wczytanie plikow - lacznie z przygotowaniem naglowkow (waveOutPrepareHeader), ale bez ich wysylania. No wiec przygotowuje naglowki, a potem przycisk play powoduje wyslanie strumienia (waveOutWrite). I nawet jesli jest to kilka instancji playera - nie ma problemu z idealna synchronizacja, niepotrzebne byly niezalezne watki itd. Prosty test - mam plik audio stereo 44.1kHz, robie kopie, w ktorej odwracam faze. I wysylam takich plikow nawet 8 jednoczesnie - na wszystkie 16 wyjsc, ktore sa potem cyfrowo sumowane na jedna pare stereo - na jego wyjsciu jest idealna cisza, choc oczywiscie wszystkie 18 wyjsc pokazuja poziomy owych plikow. Dowod na to, ze sa zsynchronizowane idealnie co do sampla.

Jedyny bol to taki, ze wczytuje je do RAMu, wiec w przypadku dlugich plikow moze byc problem. Ale nie umiem jeszcze czytac sekwencyjnie i wysylac tego buforujac dane. Z zrodel, ktore znalazlem jest jedno, ktore pracuje wlasnie w "prawdziwym" trybie streaming, ale kiedy odpalam to na slabym laptopie dostaje czkawki. Zwiekszalem wielkosc bufora, ale to nic nie dalo. I nie wiem, czy ma to sens przy 4-6 plikach, jesli chodzi wlasnie o wydajnosc. Trzebaby duzy bufor zakladac itd. Ja posluzylem sie odczytem MMIO - oczywiscie nie wymyslilem sam wszystkiego, jako wzorzec posluzyl mi kod jakiegos playera, jedynie obudowalem go w klase i podzielilem na czesci, plus moje dodatki. Jak sie uporam z wstepna wersja samego interfesju uzytkownika pochwale sie, com narozrabial ;-)

Jacek

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