/* Sound.cc - an object that holds the sound structure
 * Copyright (C) 2006-2007, Pino Toscano <pino@kde.org>
 * Copyright (C) 2009, 2017, 2018, Albert Astals Cid <aacid@kde.org>
 *
 * 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, 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., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
 */

#include "GooString.h"
#include "Object.h"
#include "Sound.h"
#include "Stream.h"
#include "FileSpec.h"

Sound *Sound::parseSound(Object *obj)
{
  // let's try to see if this Object is a Sound, according to the PDF specs
  // (section 9.2)
  Stream *str = nullptr;
  // the Object must be a Stream
  if (obj->isStream()) {
    str = obj->getStream();
  } else {
    return nullptr;
  }
  // the Stream must have a Dict
  Dict *dict = str->getDict();
  if (dict == nullptr)
    return nullptr;
  // the Dict must have the 'R' key of type num
  Object tmp = dict->lookup("R");
  if (tmp.isNum()) {
    return new Sound(obj);
  } else {
    return nullptr;
  }
}

Sound::Sound(const Object *obj, bool readAttrs)
{
  streamObj = obj->copy();

  fileName = nullptr;
  samplingRate = 0.0;
  channels = 1;
  bitsPerSample = 8;
  encoding = soundRaw;

  if (readAttrs)
  {
    Dict *dict = streamObj.getStream()->getDict();
    Object tmp = dict->lookup("F");
    if (!tmp.isNull()) {
      // valid 'F' key -> external file
      kind = soundExternal;
      Object obj1 = getFileSpecNameForPlatform (&tmp);
      if (obj1.isString()) {
        fileName = obj1.getString()->copy();
      }
    } else {
      // no file specification, then the sound data have to be
      // extracted from the stream
      kind = soundEmbedded;
    }
    // sampling rate
    tmp = dict->lookup("R");
    if (tmp.isNum()) {
      samplingRate = tmp.getNum();
    }
    // sound channels
    tmp = dict->lookup("C");
    if (tmp.isInt()) {
      channels = tmp.getInt();
    }
    // bits per sample
    tmp = dict->lookup("B");
    if (tmp.isInt()) {
      bitsPerSample = tmp.getInt();
    }
    // encoding format
    tmp = dict->lookup("E");
    if (tmp.isName())
    {
      const char *enc = tmp.getName();
      if (strcmp("Raw", enc) == 0) {
        encoding = soundRaw;
      } else if (strcmp("Signed", enc) == 0) {
        encoding = soundSigned;
      } else if (strcmp("muLaw", enc) == 0) {
        encoding = soundMuLaw;
      } else if (strcmp("ALaw", enc) == 0) {
        encoding = soundALaw;
      }
    }
  }
}

Sound::~Sound()
{
  delete fileName;
}

Stream *Sound::getStream()
{
  return streamObj.getStream();
}

Sound *Sound::copy() const
{
  Sound *newsound = new Sound(&streamObj, false);

  newsound->kind = kind;
  if (fileName) {
    newsound->fileName = fileName->copy();
  }
  newsound->samplingRate = samplingRate;
  newsound->channels = channels;
  newsound->bitsPerSample = bitsPerSample;
  newsound->encoding = encoding;

  return newsound;
}
