+ typedef std::map<string, boost::shared_ptr<AudioRegion> > RegionCache;
+ static RegionCache region_cache;
+ RegionCache::iterator the_region;
+
+ if ((the_region = region_cache.find (path)) == region_cache.end()) {
+ SourceList srclist;
+ boost::shared_ptr<AudioFileSource> afs;
+
+ for (int n = 0; n < sf_info.channels; ++n) {
+ try {
+ afs = boost::dynamic_pointer_cast<AudioFileSource> (SourceFactory::createReadable (*_session, path+":"+string_compose("%1", n), AudioFileSource::Flag (0)));
+ srclist.push_back(afs);
+
+ } catch (failed_constructor& err) {
+ error << _("Could not access soundfile: ") << path << endmsg;
+ return;
+ }
+ }
+
+ if (srclist.empty()) {
+ return;
+ }
+
+ string rname;
+
+ _session->region_name (rname, Glib::path_get_basename(srclist[0]->name()), false);
+
+ pair<string,boost::shared_ptr<AudioRegion> > newpair;
+ pair<RegionCache::iterator,bool> res;
+
+ newpair.first = path;
+ newpair.second = boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (srclist, 0, srclist[0]->length(), rname, 0, Region::DefaultFlags, false));
+
+ res = region_cache.insert (newpair);
+ the_region = res.first;
+ }
+
+ play_btn.hide();
+ stop_btn.show();
+
+ boost::shared_ptr<Region> r = boost::static_pointer_cast<Region> (the_region->second);
+
+ _session->audition_region(r);
+}