Форум программистов, компьютерный форум CyberForum.ru

Воспроизведение нескольких звуков одновременно - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.85
slamer
Сообщений: n/a
01.07.2011, 16:44     Воспроизведение нескольких звуков одновременно #1
Доброго дня, друзья.
Используется PlaySound с набором SND_FILENAME|SND_ASYNC|SND_LOOP.
В это время не прерывая текущий звук нужно вывести другой.
Можно ли это сделать с помощью PlaySound, или по другому?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
John Paramol
Сообщений: n/a
06.07.2011, 12:32     Воспроизведение нескольких звуков одновременно #2
Вам, скорее всего, подойдут следующие четыре функции, работающие со средой Media Control Interface (MCI)
(интерфейс управляющих сообщений)
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
//-------------------------------------------------------------------
#include <windows.h>
#include <mmsystem.h>
//-------------------------------------------------------------------
UINT MCIOpen(LPSTR FileName)
{
   MCI_OPEN_PARMS mciOpen;
   memset(&mciOpen,0,sizeof(MCI_OPEN_PARMS));
   mciOpen.lpstrDeviceType = (LPSTR)'waveaudio';
   mciOpen.lpstrElementName = (LPSTR)FileName;
   mciOpen.lpstrAlias = NULL;
   DWORD flags = MCI_OPEN_TYPE | MCI_OPEN_ELEMENT | MCI_WAIT;
   DWORD rc = mciSendCommand(0, MCI_OPEN, flags, 
              (DWORD)(LPVOID)&mciOpen);
   if (rc)
   {
     Beep(1000,100);
     return 0;
   }
   return mciOpen.wDeviceID;
}
//-------------------------------------------------------------------
void MCIClose(UINT wDeviceID)
{
  MCI_GENERIC_PARMS mcigen;
  DWORD rc = mciSendCommand(wDeviceID, MCI_CLOSE, MCI_WAIT, 
             (DWORD)(LPMCI_GENERIC_PARMS)&mcigen);
  if (rc) Beep(1000,100);
}
//-------------------------------------------------------------------
DWORD MCIPlay(UINT wDeviceID)
{
  MCI_PLAY_PARMS mciPlayParms;
  DWORD rc;
  rc = mciSendCommand(wDeviceID, MCI_SEEK,
       MCI_WAIT|MCI_SEEK_TO_START, NULL);
  rc = mciSendCommand(wDeviceID, MCI_PLAY, 0, 
       (DWORD)(LPVOID)&mciPlayParms);
  return rc;
}
//-------------------------------------------------------------------
DWORD MCIStop(UINT wDeviceID)
{
  MCI_GENERIC_PARMS mcigen;
  DWORD rc = mciSendCommand(wDeviceID, MCI_STOP, MCI_WAIT,
            (DWORD)(LPMCI_GENERIC_PARMS)&mcigen);
  if (rc) Beep(1000,100);
  return rc;
}
//-------------------------------------------------------------------
использовать их можно к примеру так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
main()
{
  UINT ID1 = MCIOpen('1.wav');
  UINT ID2 = MCIOpen('2.wav');
  MCIPlay(ID1);
  MCIPlay(ID2);
  Sleep(5000);
  MCIStop(ID1);
  MCIStop(ID2);
  MCIClose(ID1);
  MCIClose(ID2);
  return 0;
}
но похоже, что залупление этот интерфейс не поддерживает,
а с интерфейсом управляющих строк я не работал (там оно поддерживается).
Так что Вы можете по-прежнему пользоваться PlaySound с залуплением, и в фоне использовать эти функции.
например:
C++
1
2
3
4
5
6
7
8
9
10
main()
{
  PlaySound('1.wav',NULL,SND_FILENAME|SND_ASYNC|SND_LOOP);
  UINT ID2 = MCIOpen('2.wav');
  MCIPlay(ID2);
  Sleep(5000);
  MCIStop(ID2);
  MCIClose(ID2);
  return 0;
}
А вообще в mmsystem.dll есть много интересных функций высокого и низкого уровней.
Надо будет - кину примеры.
Удачи
slamer
Сообщений: n/a
07.07.2011, 12:09     Воспроизведение нескольких звуков одновременно #3
Спасибо за помощь, John.
Буду пробовать.
А если использовать многопоточность, как в Java-е?
Как Вы думаете?
PS. (По поводу ммsystem.h и работы с MCI)
Если у Вас есть какая нибудь информация, или ссылки на нее, пожалуйста поделитесь - aleksnc@yandex.ru
John Paramol
Сообщений: n/a
12.07.2011, 13:24     Воспроизведение нескольких звуков одновременно #4
есть у меня книжка 1996 года 'Мультимедиа для Windows -
руководство для программиста' (братья Фроловы).
В электронном виде (правда 1994) доступна по адресам:

http://emanual.ru/download/234.html
http://www.lcard.ru/~nail/frolov/bsp/v15/home.htm

правда там уже и некоторые поля в структурах не совпадают,
но это ничего, зато там исчерпывающая информация.

P.S. многопоточность скорее вряд ли поможет, зачем усложнять жизнь,
описанный способ прост и вполне работоспособен.
А если Вам нужно что-то серьезное - на это есть DirectSound
(в нем как нельзя лучше проигрываются нескольео звуков одновременно
slamer
Сообщений: n/a
13.07.2011, 12:52     Воспроизведение нескольких звуков одновременно #5
Спасибо за совет.
DirectSound, конечно, сильно. Но на данном этапе ваш первый пример с МСI то что надо.
PS: Учебник Фроловых приобрел, буду изучать.
best regards, slamer.
Yandex
Объявления
13.07.2011, 12:52     Воспроизведение нескольких звуков одновременно
Ответ Создать тему
Опции темы

Текущее время: 02:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru