// ----------------------------------------- // SoundScribe (TM) and related software. // // Copyright (C) 2007-2011 Vannatech // http://www.vannatech.com // All rights reserved. // // This source code is subject to the MIT License. // http://www.opensource.org/licenses/mit-license.php // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. // ----------------------------------------- using System; using CoreAudioTests.Common; using Microsoft.VisualStudio.TestTools.UnitTesting; using Vannatech.CoreAudio.Interfaces; using Vannatech.CoreAudio.Constants; using Vannatech.CoreAudio.Structures; namespace CoreAudioTests.EndpointVolumeApi { /// /// Tests all methods of the IAudioEndpointVolumeCallback interface. /// [TestClass] public class IAudioEndpointVolumeCallbackTest : TestClass { /// /// /// [TestMethod] public void IAudioEndpointVolumeCallback_OnNotify() { ExecuteDeviceActivationTest(activation => { var context = Guid.NewGuid(); var client = new AudioEndpointVolumeCallback(); activation.RegisterControlChangeNotify(client); client.SetExpected("MuteState", new AUDIO_VOLUME_NOTIFICATION_DATA { EventContext = context, IsMuted = true }); System.Threading.Thread.Sleep(100); activation.SetMute(true, context); var loopCount = 0; while (client.Result == -1 && loopCount < 20) { System.Threading.Thread.Sleep(100); loopCount++; } if (client.Result == -1) Assert.Inconclusive("The result was not received."); else if (client.Result == 1) Assert.Fail("The client did not receive the correct notification."); client.SetExpected("MasterVolume", new AUDIO_VOLUME_NOTIFICATION_DATA { EventContext = context, MasterVolume = -10.0f }); System.Threading.Thread.Sleep(100); activation.SetMasterVolumeLevel(-10.0f, context); loopCount = 0; while (client.Result == -1 && loopCount < 20) { System.Threading.Thread.Sleep(100); loopCount++; } if (client.Result == -1) Assert.Inconclusive("The result was not received."); else if (client.Result == 1) Assert.Fail("The client did not receive the correct notification."); activation.UnregisterControlChangeNotify(client); }); } } /// /// Local class used to test methods that require an object implementing IAudioEndpointVolumeCallback /// internal class AudioEndpointVolumeCallback : IAudioEndpointVolumeCallback { private bool _tested; private bool _passed; private string _type; private AUDIO_VOLUME_NOTIFICATION_DATA _expected; public int OnNotify(IntPtr dataPtr) { if(String.IsNullOrEmpty(_type)) return 0; var localType = _type; _type = null; _tested = true; AUDIO_VOLUME_NOTIFICATION_DATA notificationData = (AUDIO_VOLUME_NOTIFICATION_DATA)System.Runtime.InteropServices.Marshal.PtrToStructure(dataPtr, typeof(AUDIO_VOLUME_NOTIFICATION_DATA)); Assert.AreEqual(_expected.EventContext, notificationData.EventContext); switch (localType) { case "MuteState": Assert.AreEqual(_expected.IsMuted, notificationData.IsMuted); break; case "MasterVolume": Assert.AreEqual(_expected.MasterVolume, notificationData.MasterVolume); break; } _passed = true; return 0; } public void SetExpected(string type, AUDIO_VOLUME_NOTIFICATION_DATA expected) { _type = type; _expected = expected; _tested = false; _passed = false; } public int Result { get { if (!_tested) return -1; else if (_tested && _passed) return 0; else return 1; } } } }