/*
    This file is part of EqualizerAPO, a system-wide equalizer.
    Copyright (C) 2014  Jonas Thedering

    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 of the License, 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 "stdafx.h"
#include <sstream>
#include <algorithm>

#include "helpers/MemoryHelper.h"
#include "helpers/LogHelper.h"
#include "helpers/ChannelHelper.h"
#include "ChannelFilter.h"

using namespace std;

ChannelFilter::ChannelFilter(const vector<wstring>& words)
	: words(words)
{
}

ChannelFilter::~ChannelFilter()
{
}

vector<wstring> ChannelFilter::initialize(float sampleRate, unsigned maxFrameCount, vector<wstring> channelNames)
{
	size_t channelCount = channelNames.size();
	vector<bool> selectedChannels = vector<bool>(channelCount, false);

	for (vector<wstring>::iterator it = words.begin(); it != words.end(); it++)
	{
		wstring currentWord = *it;
		int channelNr = -1;

		if (currentWord == L"ALL")
			selectedChannels = vector<bool>(channelCount, true);
		else
			channelNr = ChannelHelper::getChannelIndex(currentWord, channelNames);

		if (channelNr != -1 && channelNr < (int)channelCount)
		{
			selectedChannels[channelNr] = true;
		}
	}

	vector<wstring> selectedChannelNames;
	for (unsigned i = 0; i < channelCount; i++)
	{
		if (selectedChannels[i])
			selectedChannelNames.push_back(channelNames[i]);
	}

	wstringstream channelNumbers;
	for (size_t c = 0; c < channelCount; c++)
	{
		if (selectedChannels[c])
		{
			if (channelNumbers.tellp() > 0)
				channelNumbers << L", ";

			channelNumbers << c + 1;
		}
	}

	TraceF(L"Selecting channel(s) number %s", channelNumbers.str().c_str());

	return selectedChannelNames;
}

#pragma AVRT_CODE_BEGIN
void ChannelFilter::process(float** output, float** input, unsigned frameCount)
{
	// nothing to do
}
#pragma AVRT_CODE_END
