purebasic.info

PureBasic forum
Текущее время: Пн дек 11, 2017 4:35 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 42 ]  На страницу 1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Запись звука в PB4
СообщениеДобавлено: Ср авг 15, 2007 2:13 pm 
Не в сети
док
Аватар пользователя

Зарегистрирован: Ср авг 15, 2007 1:23 pm
Сообщений: 138
Откуда: с почты
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Вопрос: как записать звук с микрофона или линейного входа в файл средствами PureBasic-а?
Встроенные функции для работы со звуком этого не позволяют. В справочниках по WinAPI ничего подобного не обнаружено.
В результате дизассемблирования sndrec32.exe нашел следующее:
1) Системная библиотека, отвечающая за мультимедиа: WINMM.DLL
2) Функиии работы со звуковым входом (вот они, родимые, все в алфавитном порядке):
waveInAddBuffer, waveInClose, waveInGetDevCapsA, waveInGetDevCapsW
waveInGetErrorTextA, waveInGetErrorTextW, waveInGetID, waveInGetNumDevs
waveInGetPosition, waveInMessage, waveInOpen, waveInPrepareHeader
waveInReset, waveInStart, waveInStop, waveInUnprepareHeader

3) Интуитивно догадываюсь, какая из них для чего нужна, но вот какие параметры им скармливать и в каком виде они выдают результат... с waveInGetNumDevs разобрался сразу. А остальные?
Буду рад любым толковым советам.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср авг 15, 2007 4:34 pm 
Не в сети
BackupUser
Аватар пользователя

Зарегистрирован: Ср ноя 29, 2006 9:29 pm
Сообщений: 1492
Откуда: Москва
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Такого кода, который бы захватывал и сохранял звук в файл,-
я не встречал.
Зато встречал код, который выводит "изображение" звука,
по типу осциллографа.

Как заставить этот код сохранять звук - я не знаю.
Код:
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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
 
;Corrected for current version of PB (3.93) (Hroudtwolf)
;Miscellaneous improvements (chris319)
;***********************************************************************************
;- DECLARATIONS                                ; SOUND CAPTURE, Flype (26-juil-2002)
;***********************************************************************************
Declare CAPTURE_Read( hWaveIn.l, lpWaveHdr.l )
Declare CAPTURE_Error( err.l )
Declare CAPTURE_Start()
Declare CAPTURE_Stop()
Declare CAPTURE_Draw()
Declare CAPTURE_Now()
Declare GUI_CallBack( hWnd.l, Message.l, wParam.l, lParam.l )
Declare GUI_Button( id.l, ico.l, tip.s )
Declare GUI_Init()
Declare GUI_Main()
Declare GUI_Resize()
Declare FILE_Recording( state.b )
Declare FILE_Create()
Declare FILE_Append()
Declare FILE_Close()
;***********************************************************************************
;- INIT CONFIGURABLE CONSTANTS
;***********************************************************************************
#SOUND_NCHANNELS   = 1      ; This example only supports Mono
#SOUND_NBITS       = 16     ; This example only supports 16 bits
#SOUND_NHERTZ      = 48000  ; Try 8000, 11050, 22100, 44100...
#SOUND_NBYTES      = 2
#HEADROOM          = 9      ; dB of headroom before clipping
#BUFFER_NUM        = 8      ; Number of buffers for capture
#BUFFER_SIZE       = 1536   ; Size of each buffer, should be x2 in Stereo
#BUFFER_TICK       = 10     ; Wave redraw delay : SetTimer_ in CAPTURE_Start()
;***********************************************************************************
;- INIT CONSTANTS
;***********************************************************************************
#gadRecord   =  0
#gadStop     =  1
#gadMode     =  2
#StatusBar   =  0
#StatusTime  =  0
#StatusInfo  =  1
#StatusFile  =  2
#COLOR_RECBACK  = $000050
#COLOR_RECLINE  = $000035
#COLOR_RECWAVE  = $1010E0
;#COLOR_CAPBACK  = $004900
#COLOR_CAPBACK  = $800000
#COLOR_CAPLINE  = $004000
#COLOR_CAPWAVE  = $20E020
#COLOR_VOLUME   = $00FFFF
#COLOR_GREEN    = $00EE00
#COLOR_RED      = $2222FF
#STR_ERROR      = "Error"
#STR_STOP       = "Stop"
#STR_RECORD     = "Record"
#STR_CLOSED     = "File saved"
#STR_SAVEREQ    = "Choose a file..."
#STR_MODE       = "Display mode"
#STR_RECORDED   = " bytes recorded"
#STR_PBFILE     = "Problem while creating file"
#STR_NODEVICE   = "Audio device not found"
;***********************************************************************************
;- INIT STRUCTURES
;***********************************************************************************
Structure RECORD_INFO
x.l          ; Left
y.l          ; Top
w.l          ; Width
h.l          ; Height
m.l          ; YMiddle
cback.l      ; Back color
cline.l      ; Line color
cwave.l      ; Wave color
size.l       ; Wave buffer size
buffer.l     ; Wave buffer pointer
output.l     ; WindowOutput()
mode.b       ; Wave mode (line or plain)
wave.l       ; Address of waveform-audio input device
frame.b      ; Counter for back clearing
update.b     ; If true Wave have to be redrawn
recorded.l   ; Number of bytes recorded
recording.b  ; Record is running...
time.s       ; Store the time string
EndStructure
Structure WAVEFORMATEX
wFormatTag.w
nChannels.w
nSamplesPerSec.l
nAvgBytesPerSec.l
nBlockAlign.w
wBitsPerSample.w
cbSize.w
EndStructure
Global Dim inHdr.WAVEHDR(#BUFFER_NUM)
Global inHdr, rec.RECORD_INFO, now.SYSTEMTIME
rec\time = Space(9)
Global scale.f, sample.w, max.w
;***********************************************************************************
;- PROCS CAPTURE
;***********************************************************************************
Procedure CAPTURE_Error( err.l )
If err
text.s = Space( #MAXERRORLENGTH )
waveInGetErrorText_( err, text, #MAXERRORLENGTH )
MessageRequester( #STR_ERROR, text, #MB_ICONERROR )
CAPTURE_Stop()
End
EndIf
EndProcedure
;==============================================================================
Procedure CAPTURE_Now()
GetLocalTime_( @now )
GetTimeFormat_(0, 0, @now, "HH:mm:ss:", @rec\time, 9 )
StatusBarText( #StatusBar, #StatusTime, rec\time+Str(now\wMilliseconds) )
EndProcedure
;==============================================================================
Procedure CAPTURE_Draw()
If rec\update = #True
CAPTURE_Now()
StartDrawing( rec\output )
;Draw Background...
If rec\frame = 2
Box( rec\x, rec\y, rec\w, rec\h, rec\cback )
shift = rec\h >> 2
Line( rec\x, rec\m - shift, rec\w, 0, rec\cline )
Line( rec\x, rec\m + shift, rec\w, 0, rec\cline )
rec\frame = 0
Else
rec\frame + 1
EndIf
;Draw Wave Data
oldx = rec\x : oldy = 0 : max = 0
For i = 0 To rec\size - #SOUND_NBYTES Step #SOUND_NBYTES ;#Word
sample = PeekW(rec\buffer + i)
If sample > max: max = sample: EndIf ;FIND PEAK VALUE WITHIN THIS BUFFER
x = rec\x + ( i * rec\w-1 ) / rec\size
y = ( sample * rec\h ) / $FFFF
If x <> oldx
Select rec\mode
Case #True  : LineXY(oldx,rec\m+oldy,x,rec\m+y,rec\cwave)
Case #False : LineXY(oldx,rec\m+oldy,x,rec\m-y,rec\cwave)
EndSelect
oldx = x : oldy = y
EndIf
Next
;Draw Meter
Box(rec\x + 2, rec\h + rec\y - 26, (max * scale) + 1, 24, #COLOR_GREEN)
StopDrawing()
rec\update = #False
EndIf
EndProcedure
;==============================================================================
Procedure.s CAPTURE_GetDevice()
Caps.WAVEINCAPS
For i = 0 To waveInGetNumDevs_()-1
CAPTURE_ERROR( waveInGetDevCaps_( i, @Caps, SizeOf( WAVEINCAPS ) ) )
If Caps\dwFormats & #WAVE_FORMAT_1S08
ProcedureReturn PeekS( @Caps\szPname, 32 )
EndIf
Next
ProcedureReturn #STR_NODEVICE
EndProcedure
;==============================================================================
Procedure CAPTURE_Start()
DeviceName.s = CAPTURE_GetDevice()
If DeviceName
SetWindowText_(WindowID(0), DeviceName)
format.WAVEFORMATEX
format\wFormatTag      = 1
format\nChannels       = #SOUND_NCHANNELS
format\wBitsPerSample  = #SOUND_NBITS
format\nSamplesPerSec  = #SOUND_NHERTZ
format\nBlockAlign     = #SOUND_NCHANNELS * (#SOUND_NBITS / 8)
format\nAvgBytesPerSec = #SOUND_NHERTZ * format\nBlockAlign
format\cbSize          = 0
CAPTURE_Error(waveInOpen_(@rec\wave, #WAVE_MAPPER, @format, WindowID(0), #Null, #CALLBACK_WINDOW | #WAVE_FORMAT_DIRECT))
For i = 0 To #BUFFER_NUM - 1
inHdr(i)\lpData         = AllocateMemory(  #BUFFER_SIZE )
inHdr(i)\dwBufferLength = #BUFFER_SIZE
CAPTURE_Error(waveInPrepareHeader_( rec\wave, inHdr(i), SizeOf( WAVEHDR ) ) )
CAPTURE_Error(waveInAddBuffer_    ( rec\wave, inHdr(i), SizeOf( WAVEHDR ) ) )
Next
CAPTURE_Error( waveInStart_( rec\wave ) )
SetTimer_( WindowID(0), 0, #BUFFER_TICK, 0 )
EndIf
EndProcedure
;==============================================================================
Procedure CAPTURE_Stop()
If rec\wave
CAPTURE_Error( waveInReset_( rec\wave ) )
CAPTURE_Error( waveInStop_ ( rec\wave ) )
For i = 0 To #BUFFER_NUM - 1
CAPTURE_Error( waveInUnprepareHeader_( rec\wave, inHdr(i), SizeOf( WAVEHDR ) ) )
Next
CAPTURE_Error( waveInClose_( rec\wave ) )
EndIf
KillTimer_( WindowID(0), 0 )
EndProcedure
;==============================================================================
Procedure CAPTURE_Read( hWaveIn.l, lpWaveHdr.l )
CAPTURE_Error( waveInAddBuffer_( hWaveIn, lpWaveHdr, SizeOf( WAVEHDR ) ) )
rec\buffer  = PeekL( lpWaveHdr )
rec\size    = PeekL( lpWaveHdr + 8 )
rec\update  = #True
FILE_Append()
EndProcedure
;***********************************************************************************
;- PROCS FILE
;***********************************************************************************
Procedure FILE_Create()
File.s = SaveFileRequester( #STR_SAVEREQ, "C:\test.raw", "Son brut|(*.raw)", 0 )
If File
If CreateFile( 0, File )
FILE_Recording( #True )
StatusBarText( #StatusBar, #StatusFile, File )
Else
MessageRequester( #STR_ERROR, #STR_PBFILE, #MB_ICONERROR )
EndIf
EndIf
EndProcedure
;==============================================================================
Procedure FILE_Append()
If rec\recording = #True
rec\recorded + rec\size
WriteData(0, rec\buffer, rec\size )
StatusBarText( #StatusBar, #StatusInfo, Str(rec\recorded) + #STR_RECORDED )
EndIf
EndProcedure
;==============================================================================
Procedure FILE_Recording( state.b )
If state = #True
rec\cback = #COLOR_RECBACK
rec\cline = #COLOR_RECLINE
rec\cwave = #COLOR_RECWAVE
Else
rec\cback = #COLOR_CAPBACK
rec\cline = #COLOR_CAPLINE
rec\cwave = #COLOR_CAPWAVE
EndIf
DisableToolBarButton(0, #gadRecord, state )
DisableToolBarButton(0, #gadStop, #True-state )
rec\recording = state
rec\recorded = 0
EndProcedure
;==============================================================================
Procedure FILE_Close()
If rec\recording = #True
FILE_Recording( #False )
CloseFile(0)
StatusBarText( #StatusBar, #StatusFile, #STR_CLOSED )
EndIf
EndProcedure
;***********************************************************************************
;- PROCS GUI
;***********************************************************************************
Procedure GUI_Button( id.l, ico.l, tip.s )
ToolBarStandardButton( id, ico )
ToolBarToolTip(0, id, tip )
EndProcedure
;==============================================================================
Procedure GUI_Init()
hFlags.l = #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered
If OpenWindow( 0, 0, 0, 480, 240, "" , hFlags) = #Null
ProcedureReturn #False
EndIf
If CreateToolBar( 0, WindowID( 0) ) = #Null
ProcedureReturn #False
EndIf
If CreateGadgetList( WindowID( 0) ) = #Null
ProcedureReturn #False
EndIf
Frame3DGadget( 0, 0,0,0,0, "", #PB_Frame3D_Double )
If CreateStatusBar( #StatusBar, WindowID( 0) ) = #Null
ProcedureReturn #False
EndIf
rec\output = WindowOutput( 0)
GUI_Button( #gadRecord, #PB_ToolBarIcon_Save,       #STR_RECORD )
GUI_Button( #gadStop,   #PB_ToolBarIcon_Delete,     #STR_STOP   )
GUI_Button( #gadMode,   #PB_ToolBarIcon_Properties, #STR_MODE   )
AddStatusBarField(   80 )
AddStatusBarField(  150 )
AddStatusBarField( $FFF )
ProcedureReturn #True
EndProcedure
;==============================================================================
Procedure GUI_Resize()
rec\x = 2
rec\y = 30
rec\w = WindowWidth(0) - 4
scale = (rec\w - 5) / ((Pow(2, #SOUND_NBITS) / 2) - 1)
rec\h = WindowHeight(0) - 52
rec\m = rec\y + rec\h / 2
ResizeGadget( 0, rec\x-2, rec\y-2, rec\w+4, rec\h+4 )
EndProcedure
;==============================================================================
Procedure GUI_CallBack( hWnd.l, uMsg.l, wParam.l, lParam.l )
Result.l = #PB_ProcessPureBasicEvents
Select uMsg
Case #MM_WIM_DATA : CAPTURE_Read( wParam, lParam )
Case #WM_TIMER    : CAPTURE_Draw()
Case #WM_SIZE     : GUI_Resize()
Case #WM_CLOSE    : Quit = #True
Case #WM_COMMAND
Select wParam
Case #gadRecord : FILE_Create()
Case #gadStop   : FILE_Close()
Case #gadMode   : rec\mode = #True-rec\mode
EndSelect
EndSelect
ProcedureReturn Result
EndProcedure
;==============================================================================
Procedure GUI_Main()
If GUI_Init()
SetWindowCallback( @GUI_CallBack() )
FILE_Recording(#False)
GUI_Resize()
CAPTURE_Start()
While WaitWindowEvent()<>#WM_CLOSE : Wend
CAPTURE_Stop()
EndIf
EndProcedure
;***********************************************************************************
;- START
;***********************************************************************************
GUI_Main()
FreeMemory(-1)
End
 



Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср авг 15, 2007 7:57 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6200
Благодарил (а): 16 раз.
Поблагодарили: 171 раз.
Пункты репутации: 48
Можно ещё найти кое что в SourseCode, а вообще надо пользоваться API-Guide или APIViwer - в этих программах есть все описания функций, где то на форуме я уже писал где их можно скачать, используй поиск.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт авг 16, 2007 9:40 am 
Не в сети
док
Аватар пользователя

Зарегистрирован: Ср авг 15, 2007 1:23 pm
Сообщений: 138
Откуда: с почты
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Ясно... Код нехилый по размерам. А если попробовать через MCI - команды? Мне желательно, чтобы запись звука шла паралельно с воспроизведением видео желательно отдельным потоком, чтобы чем поменьше нагружать основной цикл програмы. Чем для этого лучше воспользоваться: MCI, winmm-шными командами или через directx?
Демку примерно двухнедельной давности я сюда уже залил под названием subtitler. Также нерегулярно обновляемую копию можно скачать по адресу http://olejka.pisem.net/soft/subtitler.exe


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт авг 16, 2007 9:54 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пн ноя 27, 2006 2:43 pm
Сообщений: 930
Откуда: Санкт-Петербург
Благодарил (а): 1 раз.
Поблагодарили: 11 раз.
Пункты репутации: 15
WINMM.DLL

нашел такой код на C#:

пример подключения функций mmsystem:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
      [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, WaveFormat lpFormat, WaveDelegate 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);



пример описания структур:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
[StructLayout(LayoutKind.Sequential)] 
      public struct WaveHdr
      {
         public IntPtr lpData; // pointer to locked data buffer
         public int dwBufferLength; // length of data buffer
         public int dwBytesRecorded; // used for input only
         public IntPtr dwUser; // for client's use
         public int dwFlags; // assorted flags (see defines)
         public int dwLoops; // loop control counter
         public IntPtr lpNext; // PWaveHdr, reserved for driver
         public int reserved; // reserved for driver
      }



здесь: http://www.gotdotnet.ru/Forums/Common/323794.aspx


и еще такой примечик на VB:
Код:
1
2
3
4
5
6
7
8
Public Declare Function waveInStart Lib "winmm.dll" (ByVal hWaveIn As Long) As Long
Public Declare Function waveInGetNumDevs Lib "winmm.dll" () As Long
Public Declare Function waveInGetDevCaps Lib "winmm.dll" Alias "waveInGetDevCapsA" (ByVal uDeviceID As Long, lpCaps As WAVEINCAPS, ByVal uSize As Long) As Long
Public Declare Function waveInClose Lib "winmm.dll" (ByVal hWaveIn As Long) As Long
Public Declare Function waveInOpen Lib "winmm.dll" (lphWaveIn As Long, ByVal uDeviceID As Long, lpFormat As WAVEFORMATEX, ByVal dwCallback As Long, ByVal dwInstance As Long, ByVal dwFlags As Long) As Long
Public Declare Function waveInPrepareHeader Lib "winmm.dll" (ByVal hWaveIn As Long, lpWaveInHdr As WAVEHDR, ByVal uSize As Long) As Long
Public Declare Function waveInAddBuffer Lib "winmm.dll" (ByVal hWaveIn As Long, lpWaveInHdr As WAVEHDR, ByVal uSize As Long) As Long
Public Declare Function waveInUnprepareHeader Lib "winmm.dll" (ByVal hWaveIn As Long, lpWaveInHdr As WAVEHDR, ByVal uSize As Long) As Long



здесь: http://forum.vingrad.ru/forum/s/95295e9 ... 95/15.html

тут по крайней мере понятно сколько переменных какого типа ф-ции принимают и какой тип возвращают :shock:


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт авг 16, 2007 10:11 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пн ноя 27, 2006 2:43 pm
Сообщений: 930
Откуда: Санкт-Петербург
Благодарил (а): 1 раз.
Поблагодарили: 11 раз.
Пункты репутации: 15
AsterDevil писал(а):
Демку примерно двухнедельной давности я сюда уже залил под названием subtitler.


а я подумал чего это за exe-шник бесхозный, хотел удалить


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт авг 17, 2007 8:37 am 
Не в сети
док
Аватар пользователя

Зарегистрирован: Ср авг 15, 2007 1:23 pm
Сообщений: 138
Откуда: с почты
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Да нет, лучше удалить - та дема была изрядно недоделана, я потом работоспособную залью. Сейчас как раз експериментирую со звуком. Пишет, зараза. Правда, только вавки, но это уже лучше, чем ничего.
Код:
1
2
3
4
5
6
7
8
Procedure RecordWav(filename$,ms) 
  buffer$=Space(128) : DeleteFile_(filename$)
  mciSendString_("open new type waveaudio alias capture",buffer$,128,0)
  mciSendString_("set capture time format ms bitspersample 16 channels 1 samplespersec 44100",0,0,0)
  mciSendString_("record capture",buffer$,128,0)
;  Sleep_(ms) ; Wait for specified capture time to end.
;  mciSendString_("save capture "+filename$,buffer$,128,0)
EndProcedure


Нашел вот такой кодец, вставил в програму.
Плей-пауза-стоп идет через те же mciSendString_(). Играюсь пока с перемоткой.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт авг 17, 2007 1:06 pm 
Не в сети
док
Аватар пользователя

Зарегистрирован: Ср авг 15, 2007 1:23 pm
Сообщений: 138
Откуда: с почты
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Пока освежил демку на сайте по адресу http://olejka.pisem.net/soft/subtitler.exe. Видеочасть сделана, звуковая часть заработала, титровая часть... Доделаю звук - возьмусь за титры. Жду ваших пропозиций касательно звукового модуля: какие функции вы мне посоветуете добавить?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт авг 17, 2007 7:48 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6200
Благодарил (а): 16 раз.
Поблагодарили: 171 раз.
Пункты репутации: 48
1.У многих на компах стоит Lame, или в виде lame_enc.dll, или в виде lame.exe. Обычно входит в состав различных MP3-кодеров. Сделай из своей программы возможность перекодировать wav в MP3 с нужным качеством при сохранении файла. Мне кажется это самый простой способ компрессии.
2. Процесс записи ни как не контролируется визуально, нужен хоть какой то индикатор.
P.S.
Интересный проект нашёл ( bass.dll < 100 kb), и записывает с различных источников, и воспроизводит и т.п. Примеры есть на Си, Делфи, VB6, МАSM
Полно всего по этой теме.

http://www.un4seen.com/download.php?bass23


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб авг 18, 2007 1:48 pm 
Не в сети
профессор

Зарегистрирован: Сб авг 18, 2007 1:38 pm
Сообщений: 231
Благодарил (а): 1 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Ловите библиотеку ввода вывода звука, написанную мной по мотивам различных исходников на других языках.
Код:
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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
 
; Function set for Input and Output Sound use WinAPI
; Ver 1.0a
; @SAM 2007 Rubtsovsk
 
;-Struct
Structure WAVEFORMATEX
  wFormatTag.w
  nChannels.w
  nSamplesPerSec.l
  nAvgBytesPerSec.l
  nBlockAlign.w
  wBitsPerSample.w
  cbSize.w
EndStructure
 
;-Const
; описание возвращаемых процедурами ошибок
#iosNO_ERR=0; выполнено, ошибок нет
#iosERR=1;невыполнено,какая-то ошибка
#iosBAD_PAR=2; параметр передаваемый в процедуру не верен
#iosABSENT=3; невыполнено, т.к. процесс не запущен
#iosPROCESS=4;невыполнено, т.к. процесс запущен
#iosNO_INIT=5;невыполнено, т.к. не установлены параметры
 
;-Var
Global iosProcessStart.l; флаг работы процесса
Global ioswo.l,ioswi.l;хендлы события, потока и звук уст-ва.
Global ios.WAVEFORMATEX; структура описания формата
Global Dim iosbufIN.WAVEHDR(8),Dim iosbufOUT.WAVEHDR(8);Описатели для 4-ех буферов (In/Out)
Global iosNBuf.l,iosBufSize.l; кол-во и размер буфера в степени 2
Global Dim OutBuf.l(8), Dim InBuf.l(8); массивы буфферов
Global *iosFunc; указатель внешней функции обработки буферов
 
;-function
 
;процедура обновления буферов в режиме сквозного канала, в процессе выполняет внешнюю функцию
Procedure iosInOutProc( hwi.l, uMsg.l, dwInstance.l, dwParam1.l, dwParam2.l)
 If   iosProcessStart=1
  If uMsg=#MM_WIM_DATA
    For i=0 To iosNBuf
      If (iosbufIN(i)\dwFlags & #WHDR_DONE) = #WHDR_DONE                  
       waveInAddBuffer_(ioswi, @iosbufIN(i), SizeOf(WAVEHDR));принять данные с микшера
       CallFunctionFast( *iosFunc,InBuf(i),OutBuf(i),iosBufSize); обработка данных
       waveOutWrite_(ioswo,@iosbufOUT(i), SizeOf(WAVEHDR));воспроизвести        
      EndIf    
    Next    
  EndIf
 Else
  iosProcessStart=-1
 EndIf
EndProcedure
 
;процедура обновления буферов в режиме вывода звука в процессе выполняет внешнюю функцию
Procedure iosOutProc( hwi.l, uMsg.l, dwInstance.l, dwParam1.l, dwParam2.l)
 If   iosProcessStart=1
  If uMsg=#MM_WIM_DATA
    For i=0 To iosNBuf
      If (iosbufIN(i)\dwFlags & #WHDR_DONE) = #WHDR_DONE                  
       waveInAddBuffer_(ioswi, @iosbufIN(i), SizeOf(WAVEHDR));принять данные с микшера
       CallFunctionFast( *iosFunc,OutBuf(i),iosBufSize); обработка данных
       waveOutWrite_(ioswo,@iosbufOUT(i), SizeOf(WAVEHDR));воспроизвести        
      EndIf    
    Next    
  EndIf
 Else
  iosProcessStart=-1
 EndIf
EndProcedure
 
;процедура обновления буферов в режиме ввода звука в процессе выполняет внешнюю функцию
Procedure iosInProc( hwi.l, uMsg.l, dwInstance.l, dwParam1.l, dwParam2.l)
 If   iosProcessStart=1
  If uMsg=#MM_WIM_DATA
    For i=0 To iosNBuf
      If (iosbufIN(i)\dwFlags & #WHDR_DONE) = #WHDR_DONE                  
        waveInAddBuffer_(ioswi, @iosbufIN(i), SizeOf(WAVEHDR));принять данные с микшера
        CallFunctionFast( *iosFunc,InBuf(i),iosBufSize); обработка данных
      EndIf    
    Next  
  EndIf
 Else
  iosProcessStart=-1  
 EndIf
EndProcedure
 
;установка режима
;NBuf кол-во буферов(2-16)
;BufSize размер буфферов степень 2 (8-16)т.е. 256-65536 выборок
;SamplesPerSec частота выборок (из  стандартного ряда от 8000 до 96000)
;BitsPerSample размер выборки в битах(8,16,24,32)
;Channels кол-во каналов (1 или 2)
;возвращает #iosPROCESS-уже процесс запущен,#iosBAD_PAR-парамтры не верены,#iosNO_ERR- пораметры установлены
;но не факт, что с ними звуковая плата заработает
ProcedureDLL.l iosSetFormSound(NBuf.l,BufSize.l,SamplesPerSec.l,BitsPerSample.l,Channels.l)
  Protected i.l
  If iosProcessStart=1
    ProcedureReturn #iosPROCESS
  EndIf
  If BufSize<8 And BufSize>16
    ProcedureReturn #iosBAD_PAR
  EndIf  
  If NBuf<2 And NBuf>8
    ProcedureReturn #iosBAD_PAR
  EndIf
  If BitsPerSample<>8 And BitsPerSample<>16 And BitsPerSample<>24 And BitsPerSample<>32
    ProcedureReturn #iosBAD_PAR
  EndIf
  If Channels<>2 And Channels<>1
    ProcedureReturn #iosBAD_PAR
  EndIf
  If  SamplesPerSec<>24000 And SamplesPerSec<>32000 And SamplesPerSec<>44100 And SamplesPerSec<>48000 And SamplesPerSec<>96000 And SamplesPerSec<>16000 And SamplesPerSec<>22050 And SamplesPerSec<>11025 And SamplesPerSec<>8000
    ProcedureReturn #iosBAD_PAR
  EndIf                  
  iosNBuf=NBuf-1
  iosBufSize=(Channels*|!REG3XP3!>Pow(2,BufSize))*(BitsPerSample/8)
  For i=0 To iosNBuf
 ;   If  OutBuf(i)=0      
      OutBuf(i)=AllocateMemory(iosBufSize)
 ;   Else
  ;    ReAllocateMemory(OutBuf(i),iosBufSize)
 ;   EndIf    
 ;   If InBuf(i)=0        
      InBuf(i)=AllocateMemory(iosBufSize)
 ;   Else
  ;    ReAllocateMemory(InBuf(i),iosBufSize)
 ;   EndIf    
  Next  
  ; Определяем формат звука
  ios\wFormatTag= #WAVE_FORMAT_PCM
  ios\nChannels=Channels; кол-во каналов
  ios\nSamplesPerSec=SamplesPerSec ;96000, 48000,32000, 22050, 24000, 11025, 8000 частота оцифровки
  ios\wBitsPerSample =BitsPerSample  ; 8,16,32 bit дискретность
  ios\nBlockAlign     = (ios\nChannels*ios\wBitsPerSample)/8
  ios\nAvgBytesPerSec = ios\nSamplesPerSec*ios\nBlockAlign ; сколько байт на одну выборку
  ios\cbSize = 0  
  ProcedureReturn #iosNO_ERR
 EndProcedure
 
;возвращает число устройств ввода в компьютере
ProcedureDLL.l iosGetNumInDevace()
  ProcedureReturn waveInGetNumDevs_()+1;узнаем сколько устройств есть ввода
EndProcedure
 
;возвращает число устройств вывода в компьютере
ProcedureDLL.l iosGetNumOutDevace()
  ProcedureReturn waveOutGetNumDevs_()+1;узнаем сколько устройств есть вывода
EndProcedure
 
;возвращает имя устройства ввода в компьютере под номером Num
ProcedureDLL.s iosGetNameInDevace(Num.l)
    If waveInGetDevCaps_(Num-2,@Caps.WAVEINCAPS,SizeOf(WAVEINCAPS))=#MMSYSERR_NOERROR
     ProcedureReturn PeekS(@Caps\szPname,#MAXPNAMELEN)
    EndIf
EndProcedure
 
;возвращает имя устройства вывода в компьютере под номером Num
ProcedureDLL.s iosGetNameOutDevace(Num.l)
    If waveOutGetDevCaps_(Num-2,@Caps.WAVEINCAPS,SizeOf(WAVEINCAPS))=#MMSYSERR_NOERROR
      ProcedureReturn PeekS(@Caps\szPname,#MAXPNAMELEN)    
    EndIf
EndProcedure
 
;возвращает уровень звука воспроизведения главного канала
ProcedureDLL.l iosGetOutVolume()
  Protected  Vol.l
  waveOutGetVolume_(ioswo, @Vol)
  ProcedureReturn Vol
EndProcedure
 
;устанавливает уровень звука воспроизведения главного канала
ProcedureDLL.l iosSetOutVolume(volume.l)
If iosProcessStart.l=1
  waveOutSetVolume_(ioswo, volume)
Else
  ProcedureReturn #iosABSENT
EndIf  
EndProcedure
 
;запуск процесса
;NumInDev номер устройства ввода, если 0 то нет и ввода
;NumOutDev номер устройства вывода, если 0 то нет и вывода
;*func укозатель на функцию обработки буфферов
;возвращает #iosPROCESS-уже процесс запущен,#iosERR-ошибка,#iosNO_INIT-не установлен режим, #iosNO_ERR-запущен
ProcedureDLL.l iosStartProcess(NumInDev.l,NumOutDev.l,*func.l)
  Protected i.l,pri.l  
  If iosProcessStart=1
    ProcedureReturn #iosPROCESS
  EndIf
  If ios\wFormatTag<>1 And iosBifSize=0
    ProcedureReturn #iosNO_INIT
  EndIf
  If NumInDev>0 And NumOutDev>0
    If #MMSYSERR_NOERROR = waveInOpen_(@ioswi,#WAVE_MAPPER+NumInDev-2,@ios,@iosInOutProc(),0,#CALLBACK_FUNCTION|#WAVE_FORMAT_DIRECT)
        ; готовим буфeры
      For i=0 To iosNBuf
        iosbufIN(i)\lpData = InBuf(i)  
        iosbufIN(i)\dwBufferLength = iosBufSize
        waveInPrepareHeader_(ioswi, @iosbufIN(i), SizeOf(WAVEHDR));подг.  блок
        waveInAddBuffer_(ioswi,iosbufIN(i),SizeOf(WAVEHDR))      
      Next
    Else
      ProcedureReturn #iosERR
    EndIf
    If #MMSYSERR_NOERROR = waveOutOpen_(@ioswo,#WAVE_MAPPER+NumOutDev-2,@ios,0,0,#CALLBACK_NULL|#WAVE_FORMAT_DIRECT)
        ; готовим буфeры
      For i=0 To iosNBuf
       iosbufOUT(i)\lpData = OutBuf(i)  
       iosbufOUT(i)\dwBufferLength = iosBufSize      
       waveOutPrepareHeader_(ioswo, @iosbufOUT(i), SizeOf(WAVEHDR));подг.  блок      
      Next    
    Else
      ProcedureReturn #iosERR
    EndIf
  EndIf
  If NumInDev>0 And NumOutDev=0
    If #MMSYSERR_NOERROR = waveInOpen_(@ioswi,#WAVE_MAPPER+NumInDev-2,@ios,@iosInProc(),0,#CALLBACK_FUNCTION|#WAVE_FORMAT_DIRECT)
        ; готовим буфeры
      For i=0 To iosNBuf      
        iosbufIN(i)\lpData = InBuf(i)  
        iosbufIN(i)\dwBufferLength = iosBufSize
        waveInPrepareHeader_(ioswi, @iosbufIN(i), SizeOf(WAVEHDR));подг.  блок
        waveInAddBuffer_(ioswi,iosbufIN(i),SizeOf(WAVEHDR))      
      Next
    Else
      ProcedureReturn #iosERR
    EndIf
  EndIf
  If NumInDev=0 And NumOutDev>0
    If #MMSYSERR_NOERROR = waveInOpen_(@ioswi,#WAVE_MAPPER,@ios,@iosOutProc(),0,#CALLBACK_FUNCTION|#WAVE_FORMAT_DIRECT)
        ; готовим буфeры
      For i=0 To iosNBuf
        iosbufIN(i)\lpData = InBuf(i)  
        iosbufIN(i)\dwBufferLength = iosBufSize
        waveInPrepareHeader_(ioswi, @iosbufIN(i), SizeOf(WAVEHDR));подг.  блок
        waveInAddBuffer_(ioswi,iosbufIN(i),SizeOf(WAVEHDR))      
      Next
    Else
      ProcedureReturn #iosERR
    EndIf
    If #MMSYSERR_NOERROR = waveOutOpen_(@ioswo,#WAVE_MAPPER+NumOutDev-2,@ios,0,0,#CALLBACK_NULL|#WAVE_FORMAT_DIRECT)
        ; готовим буфeры
      For i=0 To iosNBuf
       iosbufOUT(i)\lpData = OutBuf(i)  
       iosbufOUT(i)\dwBufferLength = iosBufSize      
       waveOutPrepareHeader_(ioswo, @iosbufOUT(i), SizeOf(WAVEHDR));подг.  блок      
      Next    
    Else
      ProcedureReturn #iosERR
    EndIf
  EndIf        
    If #MMSYSERR_NOERROR <>  waveInStart_(iosWi);запустить запись со входа
      ProcedureReturn #iosERR
    EndIf
  *iosFunc=*func        
  iosProcessStart=1
  ProcedureReturn #iosNO_ERR
EndProcedure
 
;остановка процесса
;возвращает #iosNO_ERR-остановлен, #iosABSENT-процесс не запущен
ProcedureDLL.l iosStopProcess()
  Protected i.l
  If iosProcessStart.l=1
  iosProcessStart=0
  While iosProcessStart=0
    Delay(1)
  Wend
    waveInStop_(ioswi);остановить    
    waveInReset_(ioswi);остановить
    waveOutReset_(ioswo)              
    For i=0 To iosNBuf
      waveInUnprepareHeader_(ioswi, @iosbufIN(i), SizeOf(WAVEHDR));удалить  блок      
      waveOutUnprepareHeader_(ioswo, @iosbufOUT(i), SizeOf(WAVEHDR));удалить  блок    
    Next  
    waveInClose_(ioswo);
    waveOutClose_(ioswo);освободить звуковуху                      
    iosProcessStart.l=0
    ProcedureReturn #iosNO_ERR
  Else
    ProcedureReturn #iosABSENT  
  EndIf
EndProcedure
 
; Global time1
; Procedure DataConvertIO(*inData,*outData,bSize)
;   time1=ElapsedMilliseconds()-time1
;   DrawText(10,400,"Time: "+Str(time1)+"          ")
;   time1=ElapsedMilliseconds()
;     For i=0 To  bSize Step 2
;       PokeL(*outData+i,(PeekW(*inData+i)))
;     Next  
;  WriteData(10,*inData,bSize)
;  steping.l=bSize/2460
;  Box(0,10,640,380,RGB(0,0,0))
;  For i=1 To 639
;  dy=y
;  y=200+Int((PeekW(*inData+(i*4*steping))/180))
;  LineXY(i-1,dy,i,y,RGB(200,200,200))
;  Next
; EndProcedure
;
; Procedure DataConvertI(*inData,bSize)
;   time1=ElapsedMilliseconds()-time1
;   DrawText(10,400,"Time: "+Str(time1)+"          ")
;   time1=ElapsedMilliseconds()
;  WriteData(10,*inData,bSize)
;  steping.l=bSize/2460
;  Box(0,10,640,380,RGB(0,0,0))
;  For i=1 To 639
;  dy=y
;  y=200+Int((PeekW(*inData+(i*4*steping))/180))
;  LineXY(i-1,dy,i,y,RGB(200,200,200))
;  Next
; EndProcedure
;
; Procedure DataConvertO(*outData,bSize)
;   time1=ElapsedMilliseconds()-time1
;   DrawText(10,400,"Time: "+Str(time1)+"          ")
;   time1=ElapsedMilliseconds()
;     For i=0 To  bSize Step 2
;       PokeL(*outData+i,Random(16384))
;     Next  
;  WriteData(10,*outData,bSize)
;  steping.l=bSize/2460
;  Box(0,10,640,380,RGB(0,0,0))
;  For i=1 To 639
;  dy=y
;  y=200+Int((PeekW(*outData+(i*4*steping))/180))
;  LineXY(i-1,dy,i,y,RGB(200,200,200))
;  Next
; EndProcedure
;
; OpenWindow(0, 0, 0, 640, 480, "IOSound",  #PB_Window_SystemMenu | #PB_Window_ScreenCentered )
; DeleteFile("C:\data.raw")
; OpenFile(10,"C:\data.raw")
; StartDrawing(WindowOutput(0))
; iosGetNumOutDevace()
; iosGetNameOutDevace(2)
; iosSetFormSound(4,12,44100,16,2)
; iosStartProcess(2,2,@DataConvertIO())
; Repeat : Until WaitWindowEvent()=#WM_CLOSE
; iosStopProcess()
; CloseFile(10)
; StopDrawing()
 
; IDE Options = PureBasic v4.02 (Windows - x86)
 



Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб авг 18, 2007 2:51 pm 
Не в сети
док
Аватар пользователя

Зарегистрирован: Ср авг 15, 2007 1:23 pm
Сообщений: 138
Откуда: с почты
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Спасибо! Ну, я пошел кодить. Что-то получится - выложу (а если не будет стыдно за мой корявый код, то и вместе с исходниками)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт авг 21, 2007 5:20 pm 
Не в сети
док
Аватар пользователя

Зарегистрирован: Ср авг 15, 2007 1:23 pm
Сообщений: 138
Откуда: с почты
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Еще один вопрос немного не в тему, так, на будущее, когда доделаю вторую треть (т.е. запись звука) и возьмусь за третью (титры): как сделать так чтобы работало копирование, вырезание и вставка в StringGadget?
Таблица титров у меня оформлена так (кусок кода):
Код:
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
 
Structure subripstructure
  *|/1/>Next.subripstructure
  *Previous.subripstructure
  number.s
  timestring.s
  text.s
EndStructure
;------Брам-барам-барам-пам-пам и т.д.
      File$ = OpenFileRequester("Choose the subtitles to open", "", "Subtitle files|*.srt|All Files|*.*", 0)
      SubsFlag=1
      If Not ReadFile(#File_0, File$)
        MessageRequester(Logo$, "Error reading file "+File$, 0)
      Else
        SetGadgetAttribute(#ScrollArea_0, #PB_ScrollArea_InnerHeight, 19*20+5)
 
  OpenFile(#File_0, FileName$)
  RecordCount=0
  ClearList(subrip())
While Not Eof(#File_0)
  AddElement(subrip())
  Text$ = Trim(ReadString(#File_0, #PB_Ascii))
  If Val(text$)>0 And Len(text$)<6
    RecordCount+1
    subrip()\number=text$    
    If Not Eof(#File_0)
      Text$ = Trim(ReadString(#File_0, #PB_Ascii))
      subrip()\timestring=text$
    EndIf
    While Len(text$)>0 And Not Eof(#File_0)
      Text$ = Trim(ReadString(#File_0, #PB_Ascii))
      If subrip()\text = ""
        subrip()\text=text$
      Else
        subrip()\text+#CRLF$+text$
      EndIf
    Wend
  EndIf
Wend
  CloseFile(#File_0)
; Собственно, инициализация гаджетов:
        OpenGadgetList(#ScrollArea_0)
        SetGadgetAttribute(#ScrollArea_0, #PB_ScrollArea_InnerHeight, RecordCount*20)
        FirstElement(subrip())
        For a=0 To RecordCount-1
          StringGadget(a*5+601, 0,   a*20, 30,  20, Str(a+1), #PB_String_ReadOnly | #PB_String_Numeric)
          StringGadget(a*5+602, 30,  a*20, 50,  20, "000", #PB_String_ReadOnly | #PB_String_Numeric)
          StringGadget(a*5+603, 80,  a*20, 50,  20, "000", #PB_String_ReadOnly | #PB_String_Numeric)
          StringGadget(a*5+604, 130, a*20, 180, 20, "")
 
          SetGadgetText(a*5+601,subrip()\number)
          SetGadgetText(a*5+602,Str(Str2Time(Left(subrip()\timestring,12))))
          SetGadgetText(a*5+603,Str(Str2Time(Right(subrip()\timestring,12))))
          SetGadgetText(a*5+604,subrip()\text)
          NextElement(subrip())
        Next a
        CurrentRecord=1
        switchcolor((CurrentRecord-1)*5+601)
        switchcolor((CurrentRecord-1)*5+602)
        switchcolor((CurrentRecord-1)*5+603)
        SetActiveGadget(604)
EndIf
 


Так, вроде ничего не пропустил и ничего лишнего не добавил (сорри, програ уже перевалила за 900 строк, а для моей первой проги на РВ это уже нечто).


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт авг 21, 2007 5:22 pm 
Не в сети
док
Аватар пользователя

Зарегистрирован: Ср авг 15, 2007 1:23 pm
Сообщений: 138
Откуда: с почты
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Ах да, блин, чуть не забыл одну процедурку:
Код:
1
2
3
4
5
6
7
8
9
10
Procedure Str2Time(timestring$) ; Returnning the time in miliseconds
  hrs.c=Val(Left(timestring$,2))
  min.c=Val(Mid(timestring$,4,2))
  timestring$=ReplaceString(timestring$, ",", ".")
  sec.c=Val(Mid(timestring$,7,2))
  millisec.l=Val(Mid(timestring$,10,3))
  millisec+(sec+min*60+hrs*3600)*1000
  ProcedureReturn millisec;sec*1000
EndProcedure
 

[/code]


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт авг 21, 2007 5:55 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11069
Благодарил (а): 4 раз.
Поблагодарили: 381 раз.
Цитата:
как сделать так чтобы работало копирование, вырезание и вставка в StringGadget?
Там есть встроеное меню.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср авг 22, 2007 4:37 pm 
Не в сети
док
Аватар пользователя

Зарегистрирован: Ср авг 15, 2007 1:23 pm
Сообщений: 138
Откуда: с почты
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Встроенное меню по правой кнопке мышки есть и стандартные клавиатурные комбинации тоже. Я вот не знаю, как эти же операции продублировать через меню окна или вывести на тулбар...


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 42 ]  На страницу 1, 2, 3  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB