private Tuple <object, string, int> createAudioStream(ISampleGrabberCallbackSinkFactory aISampleGrabberCallbackSinkFactory, int aIndexCount)
        {
            object result = null;

            int index = 0;

            string lMediaType = "";

            do
            {
                ISampleGrabberCallback lAACSampleGrabberCallback;

                aISampleGrabberCallbackSinkFactory.createOutputNode(
                    MFMediaType_Audio,
                    MFAudioFormat_AAC,
                    out lAACSampleGrabberCallback);

                if (lAACSampleGrabberCallback != null)
                {
                    lAACSampleGrabberCallback.mUpdateNativeFullEvent += delegate
                                                                        (uint aSampleFlags, long aSampleTime, long aSampleDuration, IntPtr aData, uint aSize)
                    {
                        if (s != null)
                        {
                            lock (s)
                            {
                                currentmillisecond = (int)(aSampleTime / (long)10000);

                                s.sendAudioData(currentmillisecond, aData, (int)aSize, aIndexCount);
                            }
                        }
                    };

                    var lSampleGrabberCallNode = lAACSampleGrabberCallback.getTopologyNode();

                    if (lSampleGrabberCallNode != null)
                    {
                        var mEncoderControl = mCaptureManager.createEncoderControl();

                        Guid lAACEncoder = new Guid("93AF0C51-2275-45d2-A35B-F2BA21CAED00");

                        IEncoderNodeFactory lIEncoderNodeFactory;

                        mEncoderControl.createEncoderNodeFactory(lAACEncoder, out lIEncoderNodeFactory);

                        if (lIEncoderNodeFactory != null)
                        {
                            var lSourceNode = mAudioSourcesComboBox.SelectedItem as XmlNode;

                            if (lSourceNode == null)
                            {
                                break;
                            }

                            var lNode = lSourceNode.SelectSingleNode("Source.Attributes/Attribute[@Name='MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_AUDCAP_SYMBOLIC_LINK']/SingleValue/@Value");

                            if (lNode == null)
                            {
                                break;
                            }

                            string lSymbolicLink = lNode.Value;

                            lSourceNode = mAudioStreamsComboBox.SelectedItem as XmlNode;

                            if (lSourceNode == null)
                            {
                                break;
                            }

                            lNode = lSourceNode.SelectSingleNode("@Index");

                            if (lNode == null)
                            {
                                break;
                            }

                            uint lStreamIndex = 0;

                            if (!uint.TryParse(lNode.Value, out lStreamIndex))
                            {
                                break;
                            }

                            lSourceNode = mAudioMediaTypesComboBox.SelectedItem as XmlNode;

                            if (lSourceNode == null)
                            {
                                break;
                            }

                            lNode = lSourceNode.SelectSingleNode("@Index");

                            if (lNode == null)
                            {
                                break;
                            }

                            uint lMediaTypeIndex = 0;

                            if (!uint.TryParse(lNode.Value, out lMediaTypeIndex))
                            {
                                break;
                            }


                            object lAudioSourceOutputMediaType;

                            mSourceControl.getSourceOutputMediaType(
                                lSymbolicLink,
                                lStreamIndex,
                                lMediaTypeIndex,
                                out lAudioSourceOutputMediaType);

                            object lAudioEncoder;

                            lIEncoderNodeFactory.createEncoderNode(
                                lAudioSourceOutputMediaType,
                                StreamingCBR,
                                75,
                                0,
                                lSampleGrabberCallNode,
                                out lAudioEncoder);

                            object lCompressedMediaType;

                            lIEncoderNodeFactory.createCompressedMediaType(
                                lAudioSourceOutputMediaType,
                                StreamingCBR,
                                75,
                                0,
                                out lCompressedMediaType);

                            mSourceControl.createSourceNode(
                                lSymbolicLink,
                                lStreamIndex,
                                lMediaTypeIndex,
                                lAudioEncoder,
                                out result);

                            if (result != null)
                            {
                                index = aIndexCount;
                            }

                            mCaptureManager.parseMediaType(lCompressedMediaType, out lMediaType);
                        }
                    }
                }
            }while (false);

            return(Tuple.Create <object, string, int>(result, lMediaType, index));
        }