13
0

temporal: fix operator>> for Beats when handling pre-nutempo formats (double)

This commit is contained in:
Paul Davis 2021-09-10 12:11:21 -06:00
parent 300ca3124b
commit 1904c4aa29

View File

@ -120,10 +120,15 @@ Beats::round_to_subdivision (int subdivision, RoundMode dir) const {
std::istream&
Temporal::operator>>(std::istream& istr, Beats& b)
{
double dbeats;
int32_t beats, ticks;
char d; /* delimiter, whatever it is */
istr >> beats;
/* use double first to handle pre-nutempo values that would be
* serialized as double.
*/
istr >> dbeats;
if (!istr) {
throw std::invalid_argument (_("illegal or missing value for beat count"));
@ -132,9 +137,23 @@ Temporal::operator>>(std::istream& istr, Beats& b)
istr >> d; /* we don't care what the delimiter is */
if (!istr) {
if (istr.eof()) {
/* just a number. Convert dbeats and get out */
b = Beats::from_double (dbeats);
return istr;
}
throw std::invalid_argument (_("illegal or missing delimiter for beat value"));
}
/* we just assuming, since the input format included a delimiter
* character, that the numerical value was integral and convert without
* checking.
*/
beats = (int32_t) dbeats;
istr >> ticks;
if (!istr) {