lots of ios file related updates, now use URLs internally. icons added.
This commit is contained in:
		@@ -20,6 +20,8 @@ www.gnu.org/licenses
 | 
			
		||||
#include <set>
 | 
			
		||||
#include <thread>
 | 
			
		||||
 | 
			
		||||
#import "CrossPlatformUtils.h"
 | 
			
		||||
 | 
			
		||||
#ifdef WIN32
 | 
			
		||||
#undef min
 | 
			
		||||
#undef max
 | 
			
		||||
@@ -66,20 +68,21 @@ m_bufferingthread("pspluginprebufferthread"), m_is_stand_alone_offline(is_stand_
 | 
			
		||||
{
 | 
			
		||||
	m_filechoose_callback = [this](const FileChooser& chooser)
 | 
			
		||||
	{
 | 
			
		||||
		File resu = chooser.getResult();
 | 
			
		||||
		String pathname = resu.getFullPathName();
 | 
			
		||||
		if (pathname.startsWith("/localhost"))
 | 
			
		||||
		{
 | 
			
		||||
			pathname = pathname.substring(10);
 | 
			
		||||
			resu = File(pathname);
 | 
			
		||||
		}
 | 
			
		||||
		m_propsfile->m_props_file->setValue("importfilefolder", resu.getParentDirectory().getFullPathName());
 | 
			
		||||
		String loaderr = setAudioFile(resu);
 | 
			
		||||
		if (auto ed = dynamic_cast<PaulstretchpluginAudioProcessorEditor*>(getActiveEditor()); ed != nullptr)
 | 
			
		||||
		{
 | 
			
		||||
			ed->m_last_err = loaderr;
 | 
			
		||||
		}
 | 
			
		||||
		
 | 
			
		||||
		URL resu = chooser.getURLResult();
 | 
			
		||||
		//String pathname = resu.getFullPathName();
 | 
			
		||||
		//if (pathname.startsWith("/localhost"))
 | 
			
		||||
		//{
 | 
			
		||||
		//	pathname = pathname.substring(10);
 | 
			
		||||
		//	resu = File(pathname);
 | 
			
		||||
		//}
 | 
			
		||||
        if (!resu.isEmpty()) {
 | 
			
		||||
            m_propsfile->m_props_file->setValue("importfilefolder", resu.getLocalFile().getParentDirectory().getFullPathName());
 | 
			
		||||
            String loaderr = setAudioFile(resu);
 | 
			
		||||
            if (auto ed = dynamic_cast<PaulstretchpluginAudioProcessorEditor*>(getActiveEditor()); ed != nullptr)
 | 
			
		||||
            {
 | 
			
		||||
                ed->m_last_err = loaderr;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
	};
 | 
			
		||||
	m_playposinfo.timeInSeconds = 0.0;
 | 
			
		||||
	
 | 
			
		||||
@@ -268,9 +271,22 @@ ValueTree PaulstretchpluginAudioProcessor::getStateTree(bool ignoreoptions, bool
 | 
			
		||||
{
 | 
			
		||||
	ValueTree paramtree("paulstretch3pluginstate");
 | 
			
		||||
	storeToTreeProperties(paramtree, nullptr, getParameters(), { getBoolParameter(cpi_capture_trigger) });
 | 
			
		||||
    if (m_current_file != File() && ignorefile == false)
 | 
			
		||||
    if (m_current_file != URL() && ignorefile == false)
 | 
			
		||||
	{
 | 
			
		||||
		paramtree.setProperty("importedfile", m_current_file.getFullPathName(), nullptr);
 | 
			
		||||
		paramtree.setProperty("importedfile", m_current_file.toString(false), nullptr);
 | 
			
		||||
#if JUCE_IOS
 | 
			
		||||
        // store bookmark data if necessary
 | 
			
		||||
        if (void * bookmark = getURLBookmark(m_current_file)) {
 | 
			
		||||
            const void * data = nullptr;
 | 
			
		||||
            size_t datasize = 0;
 | 
			
		||||
            if (urlBookmarkToBinaryData(bookmark, data, datasize)) {
 | 
			
		||||
                DBG("Audio file has bookmark, storing it in state, size: " << datasize);
 | 
			
		||||
                paramtree.setProperty("importedfile_bookmark", var(data, datasize), nullptr);
 | 
			
		||||
            } else {
 | 
			
		||||
                DBG("Bookmark is not valid!");
 | 
			
		||||
            }
 | 
			
		||||
        } 
 | 
			
		||||
#endif
 | 
			
		||||
	}
 | 
			
		||||
	auto specorder = m_stretch_source->getSpectrumProcessOrder();
 | 
			
		||||
	paramtree.setProperty("numspectralstagesb", (int)specorder.size(), nullptr);
 | 
			
		||||
@@ -342,10 +358,31 @@ void PaulstretchpluginAudioProcessor::setStateFromTree(ValueTree tree)
 | 
			
		||||
			setPreBufferAmount(prebufamt);
 | 
			
		||||
		if (m_load_file_with_state == true)
 | 
			
		||||
		{
 | 
			
		||||
			String fn = tree.getProperty("importedfile");
 | 
			
		||||
			if (fn.isEmpty() == false)
 | 
			
		||||
            String fn = tree.getProperty("importedfile");
 | 
			
		||||
			if (fn.isNotEmpty())
 | 
			
		||||
			{
 | 
			
		||||
				setAudioFile(File(fn));
 | 
			
		||||
                URL url(fn);
 | 
			
		||||
 | 
			
		||||
                if (!url.isLocalFile()) {
 | 
			
		||||
                    // reconstruct just in case imported file string was not a URL
 | 
			
		||||
                    url = URL(File(fn));
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
#if JUCE_IOS
 | 
			
		||||
                // check for bookmark
 | 
			
		||||
                auto bptr = tree.getPropertyPointer("importedfile_bookmark");
 | 
			
		||||
                if (bptr) {
 | 
			
		||||
                    if (auto * block = bptr->getBinaryData()) {
 | 
			
		||||
                        DBG("Has file bookmark");
 | 
			
		||||
                        void * bookmark = binaryDataToUrlBookmark(block->getData(), block->getSize());
 | 
			
		||||
                        setURLBookmark(url, bookmark);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                else {
 | 
			
		||||
                    DBG("no url bookmark found");
 | 
			
		||||
                }
 | 
			
		||||
#endif
 | 
			
		||||
                setAudioFile(url);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		m_state_dirty = true;
 | 
			
		||||
@@ -546,7 +583,7 @@ void PaulstretchpluginAudioProcessor::saveCaptureBuffer()
 | 
			
		||||
				jassert(sourcebuffer->getNumSamples() > 0);
 | 
			
		||||
				
 | 
			
		||||
				writer->writeFromAudioSampleBuffer(*sourcebuffer, 0, sourcebuffer->getNumSamples());
 | 
			
		||||
				m_current_file = outfile;
 | 
			
		||||
				m_current_file = URL(outfile);
 | 
			
		||||
			}
 | 
			
		||||
			else
 | 
			
		||||
			{
 | 
			
		||||
@@ -982,7 +1019,7 @@ void PaulstretchpluginAudioProcessor::setRecordingEnabled(bool b)
 | 
			
		||||
	if (b == true)
 | 
			
		||||
	{
 | 
			
		||||
		m_using_memory_buffer = true;
 | 
			
		||||
		m_current_file = File();
 | 
			
		||||
		m_current_file = URL();
 | 
			
		||||
		int numchans = *m_inchansparam;
 | 
			
		||||
		m_recbuffer.setSize(numchans, m_max_reclen*getSampleRateChecked()+4096,false,false,true);
 | 
			
		||||
		m_recbuffer.clear();
 | 
			
		||||
@@ -1008,33 +1045,44 @@ double PaulstretchpluginAudioProcessor::getRecordingPositionPercent()
 | 
			
		||||
	return 1.0 / m_recbuffer.getNumSamples()*m_rec_pos;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
String PaulstretchpluginAudioProcessor::setAudioFile(File f)
 | 
			
		||||
String PaulstretchpluginAudioProcessor::setAudioFile(const URL & url)
 | 
			
		||||
{
 | 
			
		||||
    auto ai = unique_from_raw(m_afm->createReaderFor(f));
 | 
			
		||||
    // this handles any permissions stuff (needed on ios)
 | 
			
		||||
    std::unique_ptr<InputStream> wi (url.createInputStream (false));
 | 
			
		||||
    File file = url.getLocalFile();
 | 
			
		||||
 | 
			
		||||
    auto ai = unique_from_raw(m_afm->createReaderFor(file));
 | 
			
		||||
	if (ai != nullptr)
 | 
			
		||||
	{
 | 
			
		||||
		if (ai->numChannels > 8)
 | 
			
		||||
		{
 | 
			
		||||
			return "Too many channels in file "+f.getFullPathName();
 | 
			
		||||
			return "Too many channels in file "+ file.getFullPathName();
 | 
			
		||||
		}
 | 
			
		||||
		if (ai->bitsPerSample>32)
 | 
			
		||||
		{
 | 
			
		||||
			return "Too high bit depth in file " + f.getFullPathName();
 | 
			
		||||
			return "Too high bit depth in file " + file.getFullPathName();
 | 
			
		||||
		}
 | 
			
		||||
		if (m_thumb)
 | 
			
		||||
			m_thumb->setSource(new FileInputSource(f));
 | 
			
		||||
			m_thumb->setSource(new FileInputSource(file));
 | 
			
		||||
		ScopedLock locker(m_cs);
 | 
			
		||||
		m_stretch_source->setAudioFile(f);
 | 
			
		||||
		m_stretch_source->setAudioFile(url);
 | 
			
		||||
		//Range<double> currange{ *getFloatParameter(cpi_soundstart),*getFloatParameter(cpi_soundend) };
 | 
			
		||||
		//if (currange.contains(m_stretch_source->getInfilePositionPercent())==false)
 | 
			
		||||
			m_stretch_source->seekPercent(*getFloatParameter(cpi_soundstart));
 | 
			
		||||
		m_current_file = f;
 | 
			
		||||
        m_current_file_date = m_current_file.getLastModificationTime();
 | 
			
		||||
		m_current_file = url;
 | 
			
		||||
 | 
			
		||||
#if JUCE_IOS
 | 
			
		||||
        if (void * bookmark = getURLBookmark(m_current_file)) {
 | 
			
		||||
            DBG("Loaded audio file has bookmark");
 | 
			
		||||
        }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
        m_current_file_date = file.getLastModificationTime();
 | 
			
		||||
		m_using_memory_buffer = false;
 | 
			
		||||
		setDirty();
 | 
			
		||||
		return String();
 | 
			
		||||
	}
 | 
			
		||||
	return "Could not open file " + f.getFullPathName();
 | 
			
		||||
	return "Could not open file " + file.getFullPathName();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Range<double> PaulstretchpluginAudioProcessor::getTimeSelection()
 | 
			
		||||
@@ -1106,7 +1154,7 @@ pointer_sized_int PaulstretchpluginAudioProcessor::handleVstPluginCanDo(int32 in
 | 
			
		||||
		{
 | 
			
		||||
			String fn(CharPointer_UTF8((char*)value));
 | 
			
		||||
			//std::cout << "host requested to set audio file " << fn << "\n";
 | 
			
		||||
			auto err = setAudioFile(File(fn));
 | 
			
		||||
			auto err = setAudioFile(URL(fn));
 | 
			
		||||
			if (err.isEmpty()==false)
 | 
			
		||||
				std::cout << err << "\n";
 | 
			
		||||
		}
 | 
			
		||||
@@ -1124,7 +1172,7 @@ pointer_sized_int PaulstretchpluginAudioProcessor::handleVstManufacturerSpecific
 | 
			
		||||
void PaulstretchpluginAudioProcessor::finishRecording(int lenrecording)
 | 
			
		||||
{
 | 
			
		||||
	m_is_recording = false;
 | 
			
		||||
	m_current_file = File();
 | 
			
		||||
	m_current_file = URL();
 | 
			
		||||
	m_stretch_source->setAudioBufferAsInputSource(&m_recbuffer, getSampleRateChecked(), lenrecording);
 | 
			
		||||
	*getFloatParameter(cpi_soundstart) = 0.0f;
 | 
			
		||||
	*getFloatParameter(cpi_soundend) = jlimit<double>(0.01, 1.0, 1.0 / lenrecording * m_rec_count);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user