change Channel to store shared_ptr, add CircularBuffer