//
// 設定ファイルで指定された名前の WAVE デバイスを、hoot の出力デバイスに設定する
//

#include <Windows.h>
#include <tchar.h>
#include <io.h>
#include <stdio.h>
#include <string.h>

int _tmain(int argc, TCHAR *argv[], TCHAR *envp[])
{
	TCHAR fullPath[_MAX_PATH] = _T("");
	TCHAR drive[_MAX_DRIVE] = _T("");
	TCHAR dir[_MAX_DIR] = _T("");
	TCHAR fname[_MAX_FNAME] = _T("");
	TCHAR ext[_MAX_EXT] = _T("");
	
	TCHAR waveName[256] = _T("");	// wave デバイス名

	if (GetModuleFileName(NULL, fullPath, _countof(fullPath))) {

		_tsplitpath_s(fullPath, drive, dir, fname, ext);

		// このツール用設定ファイルのパス生成
		memset(fullPath, 0, sizeof(fullPath));
		_tmakepath_s(fullPath, drive, dir, fname, _T("ini"));
		_tprintf(_T("read ini = %s\r\n"), fullPath);

		// WAVE デバイス名を取得
		GetPrivateProfileString(_T("WAVE"), _T("OutputDevice"), _T("None"), waveName, _countof(waveName), fullPath);



		WAVEOUTCAPS caps;
		MMRESULT ret;
		UINT id = WAVE_MAPPER;

		UINT cnt = waveOutGetNumDevs();		// wave デバイス数取得

		for (UINT i = 0; i < cnt; i++)
		{
			ret = waveOutGetDevCaps(i, &caps, sizeof(WAVEOUTCAPS));
			if (ret != MMSYSERR_NOERROR) {
				break;	// 見つからない or エラー
			}
			if (_tcscmp(caps.szPname, waveName) == 0) {
				id = i;
				_tprintf(_T("[%d]device found = \"%s\"\r\n"), i, caps.szPname);
				//break;	// 一応一通り検索する
			}
			else {
				_tprintf(_T("[%d]device = \"%s\"\r\n"), i, caps.szPname);
			}
		}
		id++;	// 見つからないときは 0 になる->プライマリデバイス


		// hoot.ini に書き込む値を用意
		memset(waveName, 0, sizeof(waveName));
		_sntprintf_s(waveName, _countof(waveName), _TRUNCATE, _T("%d"), id);

		// hoot.ini のパスを生成
		memset(fullPath, 0, sizeof(fullPath));
		_tmakepath_s(fullPath, drive, dir, _T("hoot"), _T("ini"));

		if (_taccess(fullPath, 0) != -1) {		// ファイルが存在する
			WritePrivateProfileString(_T("config"), _T("output_device"), waveName, fullPath);
			_tprintf(_T("%s : output_device = %s\r\n"), fullPath, waveName);
		}
	}

	exit(0);
}