bool ckLowLevelAPI::openSoundDevice(u8 channel_num, u16 sample_rate, u16 snd_mix_buf_msec, SoundMixFunction snd_mix_func)
{
    if (isSoundDeviceOpen())
    {
        closeSoundDevice();
    }

    s_channel_num = channel_num;
    s_sample_rate = sample_rate;
    s_snd_mix_buf_msec = snd_mix_buf_msec;
    s_snd_mix_buf_size = channel_num * sample_rate * 2 * snd_mix_buf_msec / 1000;
    s_snd_mix_buf_sample_num = sample_rate * snd_mix_buf_msec / 1000;

    // TODO
    // s_is_snd_dev_open = true;

    return false; // TODO
}
bool fsLowLevelAPI::openSoundDevice(u8 channel_num, u16 sample_rate, u16 snd_mix_buf_msec, SoundMixFunction snd_mix_func)
{
	fprintf(stderr,"channel_num %d sample_rate %d snd_mix_buf_mse %d \n",channel_num, sample_rate, snd_mix_buf_msec);
    if (isSoundDeviceOpen())
    {
        closeSoundDevice();
    }

    pthread_mutex_init(&s_snd_mix_mutex, NULL);

    s_snd_mix_func =  snd_mix_func;

	m_pAudioDevice = alcOpenDevice(NULL);

	if (m_pAudioDevice)
	{
		m_pAlcContext = alcCreateContext(m_pAudioDevice, NULL);
		alcMakeContextCurrent(m_pAlcContext);
	}

	ALenum err = alGetError();
	if (err != AL_NO_ERROR)
	{
		return false;
	}

	alGenSources(1, &m_AudioSource);
	alGenBuffers(BUFFER_COUNT, m_AudioBuffers);
    s_channel_num = channel_num;
    s_sample_rate = sample_rate;
    s_snd_mix_buf_msec = snd_mix_buf_msec;

	s_snd_mix_buf_sample_num = sample_rate * snd_mix_buf_msec / 1000;
	s_bits_per_sample = 16;

    if (s_channel_num != 1 && s_channel_num != 2)
    {
        return false;
    }
	
	switch (s_bits_per_sample){
	case 8:
		m_AudioFormat = (channel_num == 1) ? AL_FORMAT_MONO8 : AL_FORMAT_STEREO8;
		break;
	case 16:
		m_AudioFormat = (channel_num == 1) ? AL_FORMAT_MONO16 : AL_FORMAT_STEREO16;
		break;
	default:
		return 0;
	}
	//	m_AudioFormat = AL_FORMAT_STEREO16;
	s_snd_mix_buf_size = 2 * s_channel_num * s_snd_mix_buf_sample_num;
	/*for (s32 i = 0; i < 2; i++)
	  {
	  s_snd_mix_buf[i] = ckMalloc(s_snd_mix_buf_size);
	  ckMemMgr::memset(s_snd_mix_buf[i], 0, s_snd_mix_buf_size);
	  }*/
	buf = fsMalloc(s_snd_mix_buf_size);
	s_snd_mix_buf = fsMalloc(s_snd_mix_buf_size*2);
	//alGenBuffers(BUFFER_COUNT, m_AudioBuffers);
	//alGenSources(1, &m_AudioSource);
	//alSourcePlay(m_AudioSource);

	s_is_playing = true;
	if (pthread_create(&s_snd_play_thread, NULL, soundPlayThread, NULL) != 0)
	{
		s_is_playing = false;
		closeSoundDevice();
		return false;
	}

//    if (pthread_create(&s_snd_play_thread, NULL, soundPlayThread, NULL) != 0)
//    {
//        s_is_playing = false;
//        closeSoundDevice();
//        return false;
//    }
//
    s_is_snd_dev_open = true;

	return true;
}