X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Futil.cc;h=71b48a520a9d7793a927e27dcdf08ffca58b8886;hb=54038beb4437c027e584fc95110f6fd4dbf2207d;hp=09f32dfda5d4b541fe5c4874a041fc47aeb6f3bf;hpb=fe9d2a290682021cd12a00bf21fa4db3012e2049;p=dcpomatic.git diff --git a/src/lib/util.cc b/src/lib/util.cc index 09f32dfda..71b48a520 100644 --- a/src/lib/util.cc +++ b/src/lib/util.cc @@ -36,8 +36,9 @@ #include "digester.h" #include "audio_processor.h" #include "compose.hpp" -#include +#include #include +#include #include #include #include @@ -92,6 +93,8 @@ using boost::optional; using boost::lexical_cast; using boost::bad_lexical_cast; using dcp::Size; +using dcp::raw_convert; +using dcp::locale_convert; /** Path to our executable, required by the stacktrace stuff and filled * in during App::onInit(). @@ -115,14 +118,9 @@ seconds_to_hms (int s) int h = m / 60; m -= (h * 60); - locked_stringstream hms; - hms << h << N_(":"); - hms.width (2); - hms << setfill ('0') << m << N_(":"); - hms.width (2); - hms << setfill ('0') << s; - - return hms.str (); + char buffer[64]; + snprintf (buffer, sizeof(buffer), "%d:%02d:%02d", h, m, s); + return buffer; } /** @param s Number of seconds. @@ -136,7 +134,7 @@ seconds_to_approximate_hms (int s) int h = m / 60; m -= (h * 60); - locked_stringstream ap; + string ap; bool const hours = h > 0; bool const minutes = h < 6 && m > 0; @@ -145,14 +143,14 @@ seconds_to_approximate_hms (int s) if (hours) { if (m > 30 && !minutes) { /// TRANSLATORS: h here is an abbreviation for hours - ap << (h + 1) << _("h"); + ap += locale_convert(h + 1) + _("h"); } else { /// TRANSLATORS: h here is an abbreviation for hours - ap << h << _("h"); + ap += locale_convert(h) + _("h"); } if (minutes || seconds) { - ap << N_(" "); + ap += N_(" "); } } @@ -160,24 +158,24 @@ seconds_to_approximate_hms (int s) /* Minutes */ if (s > 30 && !seconds) { /// TRANSLATORS: m here is an abbreviation for minutes - ap << (m + 1) << _("m"); + ap += locale_convert(m + 1) + _("m"); } else { /// TRANSLATORS: m here is an abbreviation for minutes - ap << m << _("m"); + ap += locale_convert(m) + _("m"); } if (seconds) { - ap << N_(" "); + ap += N_(" "); } } if (seconds) { /* Seconds */ /// TRANSLATORS: s here is an abbreviation for seconds - ap << s << _("s"); + ap += locale_convert(s) + _("s"); } - return ap.str (); + return ap; } double @@ -424,7 +422,7 @@ digest_head_tail (vector files, boost::uintmax_t size) while (i < int64_t (files.size()) && to_do > 0) { FILE* f = fopen_boost (files[i], "rb"); if (!f) { - throw OpenFileError (files[i].string()); + throw OpenFileError (files[i].string(), errno, true); } boost::uintmax_t this_time = min (to_do, boost::filesystem::file_size (files[i])); @@ -444,7 +442,7 @@ digest_head_tail (vector files, boost::uintmax_t size) while (i >= 0 && to_do > 0) { FILE* f = fopen_boost (files[i], "rb"); if (!f) { - throw OpenFileError (files[i].string()); + throw OpenFileError (files[i].string(), errno, true); } boost::uintmax_t this_time = min (to_do, boost::filesystem::file_size (files[i])); @@ -487,8 +485,7 @@ audio_channel_name (int c) DCPOMATIC_ASSERT (MAX_DCP_AUDIO_CHANNELS == 16); /// TRANSLATORS: these are the names of audio channels; Lfe (sub) is the low-frequency - /// enhancement channel (sub-woofer). HI is the hearing-impaired audio track and - /// VI is the visually-impaired audio track (audio describe). + /// enhancement channel (sub-woofer). string const channels[] = { _("Left"), _("Right"), @@ -511,6 +508,37 @@ audio_channel_name (int c) return channels[c]; } +string +short_audio_channel_name (int c) +{ + DCPOMATIC_ASSERT (MAX_DCP_AUDIO_CHANNELS == 16); + + /// TRANSLATORS: these are short names of audio channels; Lfe is the low-frequency + /// enhancement channel (sub-woofer). HI is the hearing-impaired audio track and + /// VI is the visually-impaired audio track (audio describe). + string const channels[] = { + _("L"), + _("R"), + _("C"), + _("Lfe"), + _("Ls"), + _("Rs"), + _("HI"), + _("VI"), + _("Lc"), + _("Rc"), + _("BsL"), + _("BsR"), + _("DBP"), + _("DBPS"), + _(""), + _("") + }; + + return channels[c]; +} + + bool valid_image_file (boost::filesystem::path f) { @@ -617,21 +645,29 @@ split_get_request (string url) } string -video_asset_filename (shared_ptr asset) +video_asset_filename (shared_ptr asset, int reel_index, int reel_count, optional summary) { dcp::NameFormat::Map values; - values["type"] = "j2c"; - values["id"] = asset->id(); - return Config::instance()->dcp_filename_format().get(values) + ".mxf"; + values['t'] = "j2c"; + values['r'] = raw_convert (reel_index + 1); + values['n'] = raw_convert (reel_count); + if (summary) { + values['c'] = summary.get(); + } + return Config::instance()->dcp_asset_filename_format().get(values, "_" + asset->id() + ".mxf"); } string -audio_asset_filename (shared_ptr asset) +audio_asset_filename (shared_ptr asset, int reel_index, int reel_count, optional summary) { dcp::NameFormat::Map values; - values["type"] = "pcm"; - values["id"] = asset->id(); - return Config::instance()->dcp_filename_format().get(values) + ".mxf"; + values['t'] = "pcm"; + values['r'] = raw_convert (reel_index + 1); + values['n'] = raw_convert (reel_count); + if (summary) { + values['c'] = summary.get(); + } + return Config::instance()->dcp_asset_filename_format().get(values, "_" + asset->id() + ".mxf"); } float