123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- #include "SoundBlockList.h"
- #include <memory.h>
- void SoundBlockList::AddBlock(void * data, size_t size)
- {
- SoundBlock * b = remove(b_free);
- if (!b) b=new SoundBlock;
- b->SetData(data,size);
- mount2(b_first,b,b_last);
- data_buffered+=size;
- #ifdef USE_LOG
- char boo[256] = {0};
- wsprintf(boo,"AddBlock: %u, +%u",data_buffered,size);
- log_write(boo);
- #endif
- }
- size_t SoundBlockList::DumpBlocks(void * out1, size_t size1)
- {
- char * p1=(char*)out1;
- size_t rv=0;
- while(b_last && size1)
- {
- if (size1)
- {
- size_t d=b_last->Dump(p1,size1);
- p1+=d;
- size1-=d;
- rv+=d;
- }
- if (b_last->GetDataSize()==0)
- {
- mount(b_free,removelast(b_first,b_last));
- }
- }
- if (size1) memset(p1,silence_filler,size1);
- data_buffered-=rv;
- return rv;
- }
- void SoundBlockList::Reset()
- {
- if (b_first)
- {
- connect(b_last,b_free);
- b_free=b_first;
- }
- b_first=0;
- b_last=0;
- data_buffered=0;
- }
- SoundBlockList::~SoundBlockList()
- {
- SoundBlock * p;
- while(b_first)
- {
- p=b_first;
- b_first=b_first->next;
- delete p;
- }
- while(b_free)
- {
- p=b_free;
- b_free=b_free->next;
- delete p;
- }
- }
- size_t SoundBlockList::DataSize()
- {
- return data_buffered;
- }
- SoundBlockList::SoundBlockList(int sil)
- {
- b_first = 0;b_last = 0;b_free = 0;data_buffered = 0;silence_filler = sil;
- }
- void SoundBlockList::advance(SoundBlock * &b)
- {
- b = b->next;
- }
- void SoundBlockList::goback(SoundBlock * &b)
- {
- b = b->prev;
- }
- void SoundBlockList::mount(SoundBlock * &first, SoundBlock * add)
- {
- connect(0, add);
- connect(add, first);
- first = add;
- }
- void SoundBlockList::mount2(SoundBlock * &first, SoundBlock * add, SoundBlock * &last)
- {
- mount(first, add);
- if (!last) last = add;
- }
- SoundBlock *SoundBlockList::remove(SoundBlock * &list)
- {
- SoundBlock * b = list;
- if (b)
- {
- advance(list);
- connect(0, list);
- connect(b, 0);
- }
- return b;
- }
- SoundBlock *SoundBlockList::removelast(SoundBlock * &first, SoundBlock * &last)
- {
- SoundBlock * b = last;
- if (b)
- {
- goback(last);
- connect(last, 0);
- connect(0, b);
- if (!last) first = 0;
- }
- return b;
- }
|