Воспроизвести байтовый массив PlaySound

Раздел посвящен программированию с использованием Power Basic.
Димитрий
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 194
Зарегистрирован: 26.01.2005 (Ср) 22:47
Откуда: Волгоград

Воспроизвести байтовый массив PlaySound

Сообщение Димитрий » 09.12.2010 (Чт) 12:17

В VB6 делал так
Код: Выделить всё
Declare Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" (lpszName As Any, ByVal hModule As Long, ByVal dwFlags As Long) As Long
Dim sndMass() As Byte

     PlaySound sndMass(0), 1, 7


Не соображу как это в PB8.
В WIN32API.INC объявление:
DECLARE FUNCTION PlaySound LIB "WINMM.DLL" ALIAS "PlaySoundA" (lpszName AS ASCIIZ, BYVAL hModule AS DWORD, BYVAL dwFlags AS DWORD) AS LONG
как туда правильно передать массив?

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: Воспроизвести байтовый массив PlaySound

Сообщение pronto » 09.12.2010 (Чт) 18:23

Прежде всего ознакомится с материалом MSDN о функции PlaySound
Потом определиться с флагами, которые ты используешь. Параметр 7 равен сумме флагов 1 + 2 + 4?
O, sancta simplicitas!

Димитрий
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 194
Зарегистрирован: 26.01.2005 (Ср) 22:47
Откуда: Волгоград

Re: Воспроизвести байтовый массив PlaySound

Сообщение Димитрий » 10.12.2010 (Пт) 8:10

Ознакомился

pronto писал(а):Параметр 7 равен сумме флагов 1 + 2 + 4?

- а может быть по другому?

Public CONST SND_ASYNC = &H1 ' play asynchronously
Public CONST SND_MEMORY = &H4 ' lpszSoundName points to a memory file
Public CONST SND_NODEFAULT = &H2 ' silence not default, if sound not found

а теперь собственно как передать массив? может его в строку перегнать (lpszName AS ASCIIZ)?

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: Воспроизвести байтовый массив PlaySound

Сообщение pronto » 11.12.2010 (Сб) 6:44

Это нужно было в коде по-другому записать
не
Код: Выделить всё
PlaySound sndMass(0), 1, 7

а
Код: Выделить всё
PlaySound sndMass(0), 1, SND_ASYNC Or SND_MEMORY Or SND_NODEFAULT

Но это лирика... Теперь. Что такое 1?
MSDN писал(а):Handle to the executable file that contains the resource to be loaded. This parameter must be NULL unless SND_RESOURCE is specified in fdwSound

То есть этот параметр должен быть равен НУЛЮ, если не установлен флаг SND_RESOURCE.
Да, и ещё. Что (в каком формате) содержит массив sndMass и как ты его заполняешь?

P.S. PlaySound(xxx, SND_MEMORY | SND_ASYNC) — почти всегда плохая идея.
O, sancta simplicitas!

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: Воспроизвести байтовый массив PlaySound

Сообщение pronto » 12.12.2010 (Вс) 15:56

Автору как будто уже не нужно решение его проблемы?..
O, sancta simplicitas!

Димитрий
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 194
Зарегистрирован: 26.01.2005 (Ср) 22:47
Откуда: Волгоград

Re: Воспроизвести байтовый массив PlaySound

Сообщение Димитрий » 13.12.2010 (Пн) 9:32

Автору как будто уже не нужно решение его проблемы?..

ещё нужно, просто в выходные нет доступа в сеть :)
PlaySound(xxx, SND_MEMORY | SND_ASYNC) — почти всегда плохая идея.

спасибо за информацию
Что (в каком формате) содержит массив sndMass и как ты его заполняешь?

как раз это сейчас проверяю, вероятно ошибки в заголовке.

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: Воспроизвести байтовый массив PlaySound

Сообщение pronto » 13.12.2010 (Пн) 9:59

Если этот же самый массив воспроизводится из VB, а из PB нет, то скорее всего проблема не в данных. Я это спрашивал для того, чтобы самому проверить эту возможность. Загрузив файл WAV мне удалось его воспроизвести этой функцией из программы на PB...
Внимательно прочитай описание флага SND_MEMORY и предположи свой следующий шаг.
O, sancta simplicitas!

Димитрий
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 194
Зарегистрирован: 26.01.2005 (Ср) 22:47
Откуда: Волгоград

Re: Воспроизвести байтовый массив PlaySound

Сообщение Димитрий » 14.12.2010 (Вт) 18:16

Вернулся к тому с чего начал:
В проекте подключено - #INCLUDE "WIN32API.INC"
конструкция - PlaySound (sndMass(0), 0&, %SND_SYNC OR %SND_MEMORY OR %SND_NODEFAULT)
не проходит

если обьявить - DECLARE FUNCTION PlaySound LIB "winmm.dll" ALIAS "PlaySoundA" (lpszName AS ANY, BYVAL hModule AS LONG, BYVAL dwFlags AS LONG) AS LONG
то конфликт с объявлениями

если бы не нужен был "WIN32API.INC", то звук воспроизводится :)

pronto
Постоялец
Постоялец
 
Сообщения: 597
Зарегистрирован: 04.12.2005 (Вс) 6:20
Откуда: Владивосток

Re: Воспроизвести байтовый массив PlaySound

Сообщение pronto » 15.12.2010 (Ср) 2:12

Всё немного проще, чем кажется. В описании флага SND_MEMORY говорится, что первым параметром в функцию должен передаться указатель на данные. На PB ты можешь получить указатель на массив функцией VarPtr? Указатель — это 32-битное целое число, соответственно, в объявлении функции нужно поменять тип параметра на Dword.
Код: Выделить всё
Declare Function PlaySound Lib "WINMM.DLL" Alias "PlaySoundA" (ByVal lpszName As Dword, ByVal hModule As Dword, ByVal dwFlags As Dword) As Long

Дальше ты наверняка столкнёшься с тем, что ошибок не возникает, но звук не воспроизводится?! Сразу вспоминай про «плохую идею».
Кстати, у тебя есть Справка по Power Basic'у?
O, sancta simplicitas!

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Воспроизвести байтовый массив PlaySound

Сообщение iGrok » 15.12.2010 (Ср) 20:41

Димитрий писал(а):если обьявить - DECLARE FUNCTION PlaySound LIB "winmm.dll" ALIAS "PlaySoundA" (lpszName AS ANY, BYVAL hModule AS LONG, BYVAL dwFlags AS LONG) AS LONG то конфликт с объявлениями

Ну, конфликт объявлений-то как раз очень легко решается.
Заменяешь имя объявляемой функции на, например, PlaySound_2 (DECLARE FUNCTION PlaySound_2 LIB "winmm.dll" ALIAS "PlaySoundA"...)
И используешь дальше её.

Но гораздо лучше, конечно, разобраться как нужно работать с оригинальным объявлением.
label:
cli
jmp label


Вернуться в Power Basic

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 42

    TopList