Merge master; fix crash on new film.
[dcpomatic.git] / src / lib / sndfile_content.cc
index 53df4deeacda2ea12d7fa127d80d39c3ac61f4e1..539b0dfb586a4926c47e4e1f3e6678966e254ad9 100644 (file)
+/*
+    Copyright (C) 2013 Carl Hetherington <cth@carlh.net>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include <libcxml/cxml.h>
 #include "sndfile_content.h"
+#include "sndfile_decoder.h"
 #include "compose.hpp"
+#include "job.h"
 
 #include "i18n.h"
 
-using namespace std;
+using std::string;
+using std::stringstream;
+using std::cout;
+using boost::shared_ptr;
+using boost::lexical_cast;
 
 SndfileContent::SndfileContent (boost::filesystem::path f)
        : Content (f)
        , AudioContent (f)
+       , _audio_channels (0)
+       , _audio_length (0)
+       , _audio_frame_rate (0)
 {
 
 }
 
+SndfileContent::SndfileContent (shared_ptr<const cxml::Node> node)
+       : Content (node)
+       , AudioContent (node)
+{
+       _audio_channels = node->number_child<int> ("AudioChannels");
+       _audio_length = node->number_child<ContentAudioFrame> ("AudioLength");
+       _audio_frame_rate = node->number_child<int> ("AudioFrameRate");
+}
+
 string
 SndfileContent::summary () const
 {
-       return String::compose (_("Sound file: %1"), file().filename ());
+       return String::compose (_("Sound file: %1"), file().filename().string());
 }
 
-int
-SndfileContent::audio_channels () const
+string
+SndfileContent::information () const
 {
-       /* XXX */
-       return 0;
+       if (_audio_frame_rate == 0) {
+               return "";
+       }
+       
+       stringstream s;
+
+       s << String::compose (
+               _("%1 channels, %2kHz, %3 samples"),
+               audio_channels(),
+               audio_frame_rate() / 1000.0,
+               audio_length()
+               );
+       
+       return s.str ();
 }
 
-ContentAudioFrame
-SndfileContent::audio_length () const
+bool
+SndfileContent::valid_file (boost::filesystem::path f)
 {
-       /* XXX */
-       return 0;
+       /* XXX: more extensions */
+       string ext = f.extension().string();
+       transform (ext.begin(), ext.end(), ext.begin(), ::tolower);
+       return (ext == ".wav" || ext == ".aif" || ext == ".aiff");
 }
 
-int
-SndfileContent::audio_frame_rate () const
+shared_ptr<Content>
+SndfileContent::clone () const
 {
-       /* XXX */
-       return 0;
+       return shared_ptr<Content> (new SndfileContent (*this));
 }
 
-int64_t
-SndfileContent::audio_channel_layout () const
+void
+SndfileContent::examine (shared_ptr<Film> film, shared_ptr<Job> job, bool quick)
 {
-       /* XXX */
-       return 0;
+       job->set_progress_unknown ();
+       Content::examine (film, job, quick);
+
+       SndfileDecoder dec (film, shared_from_this());
+
+       {
+               boost::mutex::scoped_lock lm (_mutex);
+               _audio_channels = dec.audio_channels ();
+               _audio_length = dec.audio_length ();
+               _audio_frame_rate = dec.audio_frame_rate ();
+       }
+
+       signal_changed (AudioContentProperty::AUDIO_CHANNELS);
+       signal_changed (AudioContentProperty::AUDIO_LENGTH);
+       signal_changed (AudioContentProperty::AUDIO_FRAME_RATE);
 }
-       
 
-bool
-SndfileContent::valid_file (boost::filesystem::path f)
+void
+SndfileContent::as_xml (xmlpp::Node* node) const
 {
-       /* XXX: more extensions */
-       string ext = f.extension().string();
-       transform (ext.begin(), ext.end(), ext.begin(), ::tolower);
-       return (ext == ".wav" || ext == ".aif" || ext == ".aiff");
+       node->add_child("Type")->add_child_text ("Sndfile");
+       Content::as_xml (node);
+       node->add_child("AudioChannels")->add_child_text (lexical_cast<string> (_audio_channels));
+       node->add_child("AudioLength")->add_child_text (lexical_cast<string> (_audio_length));
+       node->add_child("AudioFrameRate")->add_child_text (lexical_cast<string> (_audio_frame_rate));
 }
+