// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

#ifndef EMBEDDERS_OPENGLUI_COMMON_SAMPLE_H_
#define EMBEDDERS_OPENGLUI_COMMON_SAMPLE_H_

#include "embedders/openglui/common/resource.h"

extern Resource* MakePlatformResource(const char *path);

class Sample {
  public:
    explicit Sample(const char* path)
        : buffer_(NULL),
          length_(0) {
      resource_ = MakePlatformResource(path);
    }

    ~Sample() {
      Unload();
      delete resource_;
    }

    const char* path() {
      return resource_->path();
    }

    uint8_t* buffer() {
      return buffer_;
    }

    off_t length() {
      return length_;
    }

    int32_t Load() {
      int32_t rtn = -1;
      if (resource_->Open() == 0) {
        buffer_ = new uint8_t[length_ = resource_->length()];
        rtn = resource_->Read(buffer_, length_);
        resource_->Close();
      }
      return rtn;
    }

    void Unload() {
      if (buffer_ != NULL) {
        delete[] buffer_;
        buffer_ = NULL;
      }
      length_ = 0;
    }

  private:
    friend class SoundService;
    Resource* resource_;
    uint8_t* buffer_;
    off_t length_;
};

#endif  // EMBEDDERS_OPENGLUI_COMMON_SAMPLE_H_

