Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/21: Рейтинг темы: голосов - 21, средняя оценка - 4.71
7 / 7 / 1
Регистрация: 16.01.2012
Сообщений: 95

Снимаем звук с микрофона: ошибка 11 (invalid parameter passed)

21.02.2012, 15:32. Показов 4339. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.

Собственно сабж. На с++ реализовал, а вот на шарпе....
вот код
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
public class SoundClass
    {
        public string[] InDeviceName = new string[8];
        public byte InDeviceCount = 0;
        public IntPtr hWaveIn = IntPtr.Zero;
        public static WAVEFORMAT wavFormat = new WAVEFORMAT();
        public static WaveHdr wavHandle = new WaveHdr();
        //---------------------------
        public const uint WAVE_MAPPER = unchecked((uint)(-1));
        public const int MMSYSERR_NOERROR = 0;
        public const int MM_WOM_OPEN = 0x3BB;
        public const int MM_WOM_CLOSE = 0x3BC;
        public const int MM_WOM_DONE = 0x3BD;
        public const int MM_WIM_OPEN = 0x3BE;
        public const int MM_WIM_CLOSE = 0x3BF;
        public const int MM_WIM_DATA = 0x3C0;
        public const int CALLBACK_FUNCTION = 0x00030000;
        public const int CALLBACK_WINDOW = 0x00010000;
        public const int CALLBACK_TASK = 0x00020000;
        public const int CALLBACK_EVENT = 0x00050000;
        public const int TIME_MS = 0x0001;
        public const int TIME_SAMPLES = 0x0002;
        public const int TIME_BYTES = 0x0004;
        // ---------------------- Кулбак
        public delegate void WaveDelegateFun(IntPtr hdrvr, int uMsg, int dwUser, ref WaveHdr wavhdr, int dwParam2);
        //---------------------------------------------------
        [StructLayout(LayoutKind.Sequential)] public struct WaveHdr
        {
            public IntPtr lpData;
            public int dwBufferLength;
            public int dwBytesRecorded;
            public IntPtr dwUser;
            public int dwFlags;
            public int dwLoops;
            public IntPtr lpNext;
        }
        //----------------
        [StructLayout(LayoutKind.Sequential, Pack = 4)] public struct WaveInCaps
        {
            public short wMid;
            public short wPid;
            public int vDriverVersion;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
            public char[] szPname;
            public uint dwFormats;
            public short wChannels;
            public short wReserved1;
        }
        //----------------
        public struct WAVEFORMAT
        {
            public short FormatTag;
            public short Channels;
            public uint SamplesPerSecond;
            public uint AverageBytesPerSecond;
            public short BlockAlign;
            public short BitsPerSample;
            public int Size;
        }
        //-------------------- WaveOut -------------------------------------------
        [DllImport("winmm.dll")] public static extern int waveOutGetNumDevs();
        [DllImport("winmm.dll")] public static extern int waveOutPrepareHeader(IntPtr hWaveOut, ref WaveHdr lpWaveOutHdr, int uSize);
        [DllImport("winmm.dll")] public static extern int waveOutUnprepareHeader(IntPtr hWaveOut, ref WaveHdr lpWaveOutHdr, int uSize);
        [DllImport("winmm.dll")] public static extern int waveOutWrite(IntPtr hWaveOut, ref WaveHdr lpWaveOutHdr, int uSize);
        [DllImport("winmm.dll")] public static extern int waveOutOpen(out IntPtr hWaveOut, int uDeviceID, ref WAVEFORMAT lpFormat, IntPtr dwCallback, int dwInstance, int dwFlags);
        [DllImport("winmm.dll")] public static extern int waveOutReset(IntPtr hWaveOut);
        [DllImport("winmm.dll")] public static extern int waveOutClose(IntPtr hWaveOut);
        [DllImport("winmm.dll")] public static extern int waveOutPause(IntPtr hWaveOut);
        [DllImport("winmm.dll")] public static extern int waveOutRestart(IntPtr hWaveOut);
        [DllImport("winmm.dll")] public static extern int waveOutGetPosition(IntPtr hWaveOut, out int lpInfo, int uSize);
        [DllImport("winmm.dll")] public static extern int waveOutSetVolume(IntPtr hWaveOut, int dwVolume);
        [DllImport("winmm.dll")] public static extern int waveOutGetVolume(IntPtr hWaveOut, out int dwVolume);
        //-------------- WaveIn ----------------------------------------------------------------
        [DllImport("winmm.dll")] public static extern int waveInGetNumDevs();
        [DllImport("winmm.dll")] public static extern int waveInGetDevCapsA(int uDeviceID, ref WaveInCaps lpCaps, int uSize);
        [DllImport("winmm.dll")] public static extern int waveInAddBuffer(ref IntPtr hwi, ref WaveHdr pwh, int cbwh);
        [DllImport("winmm.dll")] public static extern int waveInClose(IntPtr hwi);
        [DllImport("winmm.dll")] public static extern uint waveInOpen(out IntPtr hWaveIn, int deviceId, ref WAVEFORMAT wfx, IntPtr dwCallBack, uint dwInstance, uint dwFlags);
        [DllImport("winmm.dll")] public static extern int waveInPrepareHeader(ref IntPtr hWaveIn, ref WaveHdr lpWaveInHdr, uint uSize);
        [DllImport("winmm.dll")] public static extern int waveInUnprepareHeader(ref IntPtr hWaveIn, ref WaveHdr lpWaveInHdr, int uSize);
        [DllImport("winmm.dll")] public static extern int waveInReset(IntPtr hwi);
        [DllImport("winmm.dll")] public static extern int waveInStart(IntPtr hwi);
        [DllImport("winmm.dll")] public static extern int waveInStop(IntPtr hwi);
        //-------------------------------------------------------    
        public SoundClass()
        {
            short i, j;
 
            InDeviceCount = (byte)waveInGetNumDevs();
            if (InDeviceCount > 0)
            {
                for (i = 0; i < InDeviceCount; i++)
                {
                    WaveInCaps waveInCaps = new WaveInCaps();
                    waveInGetDevCapsA(i, ref waveInCaps, Marshal.SizeOf(typeof(WaveInCaps)));
                    for (j = 0; j < waveInCaps.szPname.Length; j++)
                        InDeviceName[i] += waveInCaps.szPname[j];
                }
            }
        }
        //--------------------------------------------------------
        public int StartInAudioDevice(int DeviceNum)
        {
 
            wavFormat.FormatTag = 1;
            wavFormat.Channels = 2;
            wavFormat.SamplesPerSecond = 44100;
            wavFormat.AverageBytesPerSecond = 176400;
            wavFormat.BlockAlign = 4;
            wavFormat.BitsPerSample = 16;
            wavFormat.Size = Marshal.SizeOf(wavFormat);
 
            uint result = 0;
            result = waveInOpen(out hWaveIn, DeviceNum, ref wavFormat, Marshal.GetFunctionPointerForDelegate(new WaveDelegateFun(CallBackFunction)), 0, CALLBACK_FUNCTION);
            if (result != MMSYSERR_NOERROR) 
                return -1;
 
            wavHandle.lpData = GCHandle.Alloc(new byte[176400 * 100], GCHandleType.Pinned).AddrOfPinnedObject();
            wavHandle.dwBufferLength = 176400 * 100;
            wavHandle.dwFlags = 0;
 
            result = (uint)waveInPrepareHeader(ref hWaveIn, ref wavHandle, Convert.ToUInt32(Marshal.SizeOf(wavHandle)));
            if ( result != MMSYSERR_NOERROR) 
                return -1;
 
            if (waveInAddBuffer(ref hWaveIn, ref wavHandle, Marshal.SizeOf(wavHandle)) != MMSYSERR_NOERROR) 
                return -1;
 
            return 0;
        }
        //-------------------------------------------------------
        public void StopInDevice(int DeviceNum)
        {
            waveInClose(hWaveIn);
        }
        //----------------------------------------------------------------------------
        public static void CallBackFunction(IntPtr hdrvr, int uMsg, int dwUser, ref WaveHdr wavhdr, int dwParam2)
        {
        return;
        }
    }//public static class Sounds
Собственно вопрос: вызов waveInPrepareHeader стабильно выдает ошибку 11 (invalid parameter passed), в чем ошибка? Не пойму.
Если время есть помогите.

Добавлено через 22 часа 31 минуту
Продолжаем разговор

С этим (см. выше) разобрался, оказалось что я неправильно определил структуру
C#
1
2
3
4
5
6
7
8
9
10
11
        [StructLayout(LayoutKind.Sequential)] public struct WaveHdr
        {
            public IntPtr lpData;
            public int dwBufferLength;
            public int dwBytesRecorded;
            public IntPtr dwUser;
            public int dwFlags;
            public int dwLoops;
            public IntPtr lpNext;
            public IntPtr reserved; // Вот это забыл
        }
Вроде все сработало, но CallBack функция вызывается 1 раз при вызове waveInOpen
хотя должна вызываться периодически, что делать, может я не правильно объявил функцию?
C#
1
2
3
4
5
6
7
8
9
10
11
public delegate void WaveDelegateFun(IntPtr hdrvr, int uMsg, int dwUser, ref WaveHdr wavhdr, int dwParam2);
....
waveInOpen(out hWaveIn, DeviceNum, ref wavFormat, new WaveDelegateFun(CallBackFunction), 0, CALLBACK_FUNCTION)
....
public static void CallBackFunction(IntPtr hdrvr, int uMsg, int dwUser, ref WaveHdr wavhdr, int dwParam2)
        {
            int i;
            
            i = 0;
        return;
        }
Если есть мысли, черкните. ( Критики не боюсь )
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.02.2012, 15:32
Ответы с готовыми решениями:

Ошибка при сборке: Invalid parameter passed to C runtime function
#include &lt;stdio.h&gt; #include &lt;iostream&gt; #include &lt;fstream&gt; typedef unsigned long int uint; typedef struct...

Ошибка Invalid parameter passed to C runtime function при чтении файла
Всем привет.Такая ситуация:есть бинарный файл и известна структура некого пакета и его контрольная сумма.Я открываю файл(100мб),дальше ищу...

Invalid parameter passed to C runtime function
Здравствуйте программа работает нормально в линуксе а вот в винде краш вот код mainwindow.h #ifndef MAINWINDOW_H #define...

1
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
21.02.2012, 18:11
Вот здесь есть код на C++, отчасти переписав его я получаю 3 события: Open - Data - Close.

p.s. Ошибки исправил, некоторые выделил...
p.p.s. Продумайте логику в классе, иначе это жесть...
Вложения
Тип файла: rar ConsoleApplication30.rar (5.3 Кб, 67 просмотров)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.02.2012, 18:11
Помогаю со студенческими работами здесь

Ошибка: Constant object cannot be passed as var parameter
else if (TS = 'PRIVMSG') then begin uMessage:=''; for i:=1 to j do //Проверяем кто написал сообщение ...

[Ошибка] Constant object cannot be passed as var parameter
procedure TForm1.Button1Click(Sender: TObject); const x: array of byte = ($01, $01, $01, $01, $01); begin S.SendTo(x, sizeof(x)); ...

Ошибка Constant object cannot be passed as var parameter
Привет. При пропускание через функции Insert и Delete, выдает ошибку(в название темы). Перевод примерно такой: Константа не может бы...

Ошибка Constant object cannot be passed as var parameter
Подскажите почему ошибка &quot;Constant object cannot be passed as var parameter&quot;? procedure TContractRunnerDlg.sINNKeyPress(Sender:...

Ошибка: [Error] Project1.dpr(11): Constant object cannot be passed as var parameter Operator not applicable to this operand type
Помогите пожалуйста, в чем ошибка? помогите решить unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru