#pragma once
#include "ggml-backend.h"
#include <vector>

struct whisper_mel {
    int n_len_org = 0;

    ggml_context * ctx = nullptr;
    ggml_tensor * tensor = nullptr;
    ggml_backend_buffer_t buffer = nullptr;
};

void whisper_mel_init(whisper_mel & mel, ggml_backend_t backend, int n_len, int n_len_org, int n_mel);

void whisper_mel_free(whisper_mel & mel);

struct whisper_filters {
    int32_t n_mel;
    int32_t n_fft;

    std::vector<float> data;
};

template <typename T>
struct whisper_span {
    T * data;
    int len;
};

struct whisper_mel_calc {
    virtual ~whisper_mel_calc();
    virtual whisper_mel calculate(whisper_span<const float> samples, int n_threads) = 0;
    static whisper_span<const float> hann_window();
};