--- /dev/null
+#!/bin/bash
+
+export LD_LIBRARY_PATH=build/src/lib:$LD_LIBRARY_PATH:build/src
+if [ "$1" == "--debug" ]; then
+ shift
+ gdb --args build/src/tools/dcpomatic_cli "$@"
+elif [ "$1" == "--valgrind" ]; then
+ shift
+ valgrind --tool="memcheck" --leak-check=full --show-reachable=yes build/src/tools/dcpomatic_cli "$@"
+else
+ build/src/tools/dcpomatic_cli "$@"
+fi
+++ /dev/null
-#!/bin/bash
-
-export LD_LIBRARY_PATH=build/src/lib:$LD_LIBRARY_PATH:build/src
-if [ "$1" == "--debug" ]; then
- shift
- gdb --args build/src/tools/makedcp "$@"
-elif [ "$1" == "--valgrind" ]; then
- shift
- valgrind --tool="memcheck" --leak-check=full --show-reachable=yes build/src/tools/makedcp "$@"
-else
- build/src/tools/makedcp "$@"
-fi
return _playlist->has_subtitles ();
}
+string
+Film::playlist_description () const
+{
+ return _playlist->description ();
+}
+
void
Film::set_audio_mapping (AudioMapping m)
{
ContentVideoFrame content_length () const;
+ std::string playlist_description () const;
+
void set_loop (int);
int loop () const;
#include "imagemagick_content.h"
#include "job.h"
+#include "i18n.h"
+
using std::list;
using std::cout;
using std::vector;
using std::min;
using std::max;
using std::string;
+using std::stringstream;
using boost::shared_ptr;
using boost::weak_ptr;
using boost::dynamic_pointer_cast;
return !fc->subtitle_streams().empty();
}
+
+string
+Playlist::description () const
+{
+ stringstream s;
+
+ if (_video.empty ()) {
+ s << _("There is no video.") << "\n";
+ } else {
+ s << _("Video will come from ");
+ list<shared_ptr<const VideoContent> >::const_iterator i = _video.begin();
+ while (i != _video.end ()) {
+ s << (*i)->file().filename().string();
+ ++i;
+ if (i != _video.end ()) {
+ s << ", ";
+ }
+ }
+ if (_video.size() > 1) {
+ s << " " << _("in sequence.");
+ }
+ s << "\n";
+ }
+
+ if (_audio.empty ()) {
+ s << _("There is no audio.") << "\n";
+ } else {
+ if (_audio_from == AUDIO_FFMPEG) {
+ s << _("Audio will come from the video files.") << "\n";
+ } else {
+ s << _("Audio will come from ");
+ list<shared_ptr<const AudioContent> >::const_iterator i = _audio.begin();
+ while (i != _audio.end ()) {
+ s << (*i)->file().filename().string();
+ ++i;
+ if (i != _audio.end ()) {
+ s << ", ";
+ }
+ }
+ if (_audio.size() > 1) {
+ s << _(" run simultaneously.");
+ }
+ s << "\n";
+ }
+ }
+
+ return s.str ();
+}
return _content;
}
+ std::string description () const;
+
boost::shared_ptr<FFmpegContent> ffmpeg () const;
std::list<boost::shared_ptr<const VideoContent> > video () const {
: Decoder (f)
, AudioDecoder (f)
, _sndfile_content (c)
+ , _deinterleave_buffer (0)
{
_sndfile = sf_open (_sndfile_content->file().string().c_str(), SFM_READ, &_info);
if (!_sndfile) {
SndfileDecoder::~SndfileDecoder ()
{
sf_close (_sndfile);
+ delete[] _deinterleave_buffer;
}
bool
*/
sf_count_t const block = _sndfile_content->audio_frame_rate() / 2;
sf_count_t const this_time = min (block, _remaining);
+
+ int const channels = _sndfile_content->audio_channels ();
- shared_ptr<AudioBuffers> audio (new AudioBuffers (_sndfile_content->audio_channels(), this_time));
- sf_read_float (_sndfile, audio->data(0), this_time);
+ shared_ptr<AudioBuffers> audio (new AudioBuffers (channels, this_time));
+
+ if (_sndfile_content->audio_channels() == 1) {
+ /* No de-interleaving required */
+ sf_read_float (_sndfile, audio->data(0), this_time);
+ } else {
+ /* Deinterleave */
+ if (!_deinterleave_buffer) {
+ _deinterleave_buffer = new float[block * channels];
+ }
+ sf_readf_float (_sndfile, _deinterleave_buffer, this_time);
+ vector<float*> out_ptr (channels);
+ for (int i = 0; i < channels; ++i) {
+ out_ptr[i] = audio->data(i);
+ }
+ float* in_ptr = _deinterleave_buffer;
+ for (int i = 0; i < this_time; ++i) {
+ for (int j = 0; j < channels; ++j) {
+ *out_ptr[j]++ = *in_ptr++;
+ }
+ }
+ }
+
audio->set_frames (this_time);
Audio (audio, double(_done) / audio_frame_rate());
_done += this_time;
SF_INFO _info;
ContentAudioFrame _done;
ContentAudioFrame _remaining;
+ float* _deinterleave_buffer;
};
make_subtitle_panel ();
_notebook->AddPage (_subtitle_panel, _("Subtitles"), false);
+ setup_formats ();
+
set_film (f);
connect_to_widgets ();
bind (&FilmEditor::active_jobs_changed, this, _1)
);
- setup_formats ();
-
SetSizerAndFit (s);
}
s->Add (b, 0, wxALL, 4);
- _content_sizer->Add (s, 1, wxEXPAND | wxALL, 6);
+ _content_sizer->Add (s, 0.75, wxEXPAND | wxALL, 6);
}
+ _content_information = new wxTextCtrl (_content_panel, wxID_ANY, wxT ("\n \n "), wxDefaultPosition, wxDefaultSize, wxTE_READONLY | wxTE_MULTILINE);
+ _content_sizer->Add (_content_information, 1, wxEXPAND | wxALL, 6);
+
wxBoxSizer* h = new wxBoxSizer (wxHORIZONTAL);
_loop_content = new wxCheckBox (_content_panel, wxID_ANY, _("Loop everything"));
h->Add (_loop_content, 0, wxALL, 6);
add_label_to_sizer (h, _content_panel, _("times"));
_content_sizer->Add (h, 0, wxALL, 6);
- _content_information = new wxTextCtrl (_content_panel, wxID_ANY, wxT ("\n\n\n\n"), wxDefaultPosition, wxDefaultSize, wxTE_READONLY | wxTE_MULTILINE);
- _content_sizer->Add (_content_information, 1, wxEXPAND | wxALL, 6);
+ _playlist_description = new wxStaticText (_content_panel, wxID_ANY, wxT ("\n \n \n \n "));
+ _content_sizer->Add (_playlist_description, 0.25, wxEXPAND | wxALL, 6);
+ wxFont font = _playlist_description->GetFont();
+ font.SetStyle(wxFONTSTYLE_ITALIC);
+ font.SetPointSize(font.GetPointSize() - 1);
+ _playlist_description->SetFont(font);
_loop_count->SetRange (2, 1024);
}
/* Select the first item of content if non was selected before */
_content->SetItemState (0, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED);
}
+
+ setup_playlist_description ();
}
void
{
_loop_count->Enable (_loop_content->GetValue ());
}
+
+void
+FilmEditor::setup_playlist_description ()
+{
+ if (!_film) {
+ _playlist_description->SetLabel (wxT (""));
+ return;
+ }
+
+ _playlist_description->SetLabel (std_to_wx (_film->playlist_description ()));
+}
void setup_content_information ();
void setup_content_button_sensitivity ();
void setup_loop_sensitivity ();
+ void setup_playlist_description ();
void active_jobs_changed (bool);
boost::shared_ptr<Content> selected_content ();
wxTextCtrl* _content_information;
wxCheckBox* _loop_content;
wxSpinCtrl* _loop_count;
+ wxStaticText* _playlist_description;
wxButton* _edit_dci_button;
wxChoice* _format;
wxStaticText* _format_description;