Subversion Repositories Kolibri OS

Rev

Rev 539 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
485 heavyiron 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;                                             ;
3
;    Tiny MP3 Shoutcast Server v0.1 (vt)      ;
4
;                                             ;
5
;    Compile with FASM for Menuet             ;
6
;                                             ;
7
;    Listening to port 8008                   ;
8
;    Connect with eg: 192.168.1.22:8008       ;
9
;                                             ;
10
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
11
 
12
version  equ  '0.3'
13
 
14
  use32
15
  org     0x0
16
  db      'MENUET01'    ; 8 byte id
17
  dd      0x01          ; header version
18
  dd      START         ; program start
19
  dd      I_END         ; program image size
20
  dd      0x80000       ; memory usage
21
  dd      0x20000       ; stack
22
  dd      0,0
23
 
24
include 'lang.inc'
25
include '..\..\..\macros.inc'
26
 
27
; 0x0+      program image
28
; 0x1ffff   stack
29
; 0x20000   work area for file read
30
; 0x40000+  file send buffer ( 100 kb )
31
 
32
 
33
START:                          ; start of execution
34
 
35
    mov  [status],0
36
    call clear_input
37
    call draw_window            ; at first, draw the window
38
 
39
still:
40
 
41
    mov  eax,23                 ; wait here for event
42
    mov  ebx,2
43
    mcall
44
 
45
    call check_events
46
 
47
    call check_connection_status
48
 
49
    cmp  [status],4
50
    je   start_transmission
51
 
52
    jmp  still
53
 
54
 
55
check_events:
56
 
57
    cmp  eax,1                  ; redraw request ?
58
    jz   red
59
    cmp  eax,2                  ; key in buffer ?
60
    jz   key
61
    cmp  eax,3                  ; button in buffer ?
62
    jz   button
63
 
64
    ret
65
 
66
red:                           ; redraw
67
    call draw_window
68
    ret
69
 
70
key:
71
    mov  eax,2                 ; Just read it and ignore
72
    mcall
73
    ret
74
 
75
button:                         ; button
76
 
77
    mov  eax,17                 ; get id
78
    mcall
79
 
80
    cmp  ah,1                   ; close
81
    jne  no_close
82
    mov  eax,-1
83
    mcall
84
  no_close:
85
 
86
    cmp  ah,2                   ; button id=2 ?
87
    jnz  tst3
88
    ; open socket
89
    mov  eax,53
90
    mov  ebx,5
91
    mov  ecx,8008   ; local port # - http
92
    mov  edx,0      ; no remote port specified
93
    mov  esi,0      ; no remote ip specified
94
    mov  edi,0      ; PASSIVE open
95
    mcall
96
    mov  [socket], eax
97
    mov  [posy],1
98
    mov  [posx],0
99
    mov  [read_on],1
100
    call check_for_incoming_data
101
    call draw_window
102
    ret
103
  tst3:
104
 
105
    cmp  ah,4
106
    je   close_socket
107
    cmp  ah,6
108
    je   close_socket
109
    jmp  no_socket_close
110
  close_socket:
111
    mov  edx,eax
112
    ; Close socket
113
    mov  eax, 53
114
    mov  ebx, 8
115
    mov  ecx, [socket]
116
    mcall
117
    mov  esp,0x1fff0
118
    cmp  dh,6
119
    je   read_string
120
    jmp  still
121
  no_socket_close:
122
 
123
    cmp  ah,9
124
    jne  no_bps_add
125
    add  [bps],8*1000
126
    call draw_window
127
    ret
128
  no_bps_add:
129
 
130
    cmp  ah,8
131
    jne  no_bps_sub
132
    sub  [bps],8*1000
133
    call draw_window
134
    ret
135
  no_bps_sub:
136
 
137
 
138
    ret
139
 
140
 
141
clear_input:
142
 
143
    mov  edi,input_text
144
    mov  eax,0
145
    mov  ecx,60*40
146
    cld
147
    rep  stosb
148
 
149
    ret
150
 
151
 
152
read_string:
153
 
154
    mov  [addr],dword filename
155
    mov  [ya],dword 95
156
 
157
    mov  edi,[addr]
158
    mov  eax,32
159
    mov  ecx,30
160
    cld
161
    rep  stosb
162
 
163
    call print_text
164
 
165
    mov  edi,[addr]
166
 
167
  f11:
168
    mov  eax,10
169
    mcall
170
    cmp  eax,2
171
    jne  read_done
172
    mov  eax,2
173
    mcall
174
    shr  eax,8
175
    cmp  eax,13
176
    je   read_done
177
    cmp  eax,8
178
    jnz  nobsl
179
    cmp  edi,[addr]
180
    jz   f11
181
    sub  edi,1
182
    mov  [edi],byte 32
183
    call print_text
184
    jmp  f11
185
  nobsl:
186
    cmp  eax,dword 31
187
    jbe  f11
188
    cmp  eax,dword 95
189
    jb   keyok
190
    sub  eax,32
191
  keyok:
192
    mov  [edi],al
193
 
194
    call print_text
195
 
196
    add  edi,1
197
    mov  esi,[addr]
198
    add  esi,30
199
    cmp  esi,edi
200
    jnz  f11
201
 
202
  read_done:
203
 
204
    mov  ecx,40
205
    mov  eax,0
206
    cld
207
    rep  movsb
208
 
209
    call print_text
210
 
211
    jmp  still
212
 
213
 
214
print_text:
215
 
216
    pusha
217
 
218
    mov  eax,13
219
    mov  ebx,56*65536+30*6
220
    mov  ecx,[ya]
221
    shl  ecx,16
222
    mov  cx,8
223
    mov  edx,0xffffff
224
    mcall
225
 
226
    mov  eax,4
227
    mov  edx,[addr]
228
    mov  ebx,56*65536
229
    add  ebx,[ya]
230
    mov  ecx,0x000000
231
    mov  esi,30
232
    mcall
233
 
234
    popa
235
    ret
236
 
237
 
238
wait_for  dd 0x0
239
 
240
transmission_start  dd  0x0
241
sentbytes           dd  0x0
242
 
243
start_transmission:
244
 
245
    call clear_input
246
 
247
    mov  eax,5
248
    mov  ebx,50
249
    mcall
250
 
251
    call check_for_incoming_data
252
    call draw_window
253
 
254
    call send_header
255
 
256
    mov  [fileinfo+4],dword 0   ; start from beginning
257
    mov  [read_to],0x40000
258
    mov  [playpos],0x40000
259
 
260
    mov  ecx,1024 / 512
261
 
262
  new_buffer:
263
 
264
    mov  eax,[read_to]
265
    mov  ebx,1
266
    call read_file
267
 
268
    loop new_buffer
269
 
270
 
271
  newpart:
272
 
273
    call check_connection_status
274
    call draw_window
275
 
276
    mov  eax,26
277
    mov  ebx,9
278
    mcall
279
    mov  [transmission_start],eax
280
    mov  [sentbytes],0
281
 
282
  newblock:
283
 
284
    mov  eax,[read_to]
285
    mov  ebx,2
286
    call read_file
287
 
288
  wait_more:
289
 
290
    mov  eax,26
291
    mov  ebx,9
292
    mcall
293
 
294
    cmp  eax,[wait_for]
295
    jge  nomw
296
 
297
    mov  eax,5
298
    mov  ebx,1
299
    mcall
300
 
301
    jmp  wait_more
302
 
303
  nomw:
304
 
305
    add  eax,2
306
    mov  [wait_for],eax
307
 
308
    mov  eax,11
309
    mcall
310
    call check_events
311
 
312
    mov  eax,53
313
    mov  ebx,255
314
    mov  ecx,103
315
    mcall
316
 
317
    cmp  eax,0
318
    jne  wait_more
319
 
320
    ; write to socket
321
    mov  eax,53
322
    mov  ebx,7
323
    mov  ecx,[socket]
324
    mov  edx,[playadd]
325
    mov  esi,[playpos]
326
    mcall
327
 
328
    add  [sentbytes],edx
329
 
330
    mov  esi,[playpos]
331
    add  esi,[playadd]
332
    mov  edi,0x40000
333
    mov  ecx,110000 / 4
334
    cld
335
    rep  movsd
336
 
337
    mov  eax,[playadd]
338
    sub  [read_to],eax
339
 
340
    call check_for_incoming_data
341
    call show_progress
342
    call check_rate
343
 
344
    mov  eax, 53
345
    mov  ebx, 6
346
    mov  ecx, [socket]
347
    mcall
348
    cmp  eax,4
349
    jne  end_stream
350
 
351
    cmp  [read_to],0x40000
352
    jge  newblock
353
 
354
  end_stream:
355
 
356
    ; Close socket
357
 
358
    mov  eax, 53
359
    mov  ebx, 8
360
    mov  ecx, [socket]
361
    mcall
362
 
363
    mov  eax,5
364
    mov  ebx,5
365
    mcall
366
 
367
    ; Open socket
368
 
369
    mov  eax,53
370
    mov  ebx,5
371
    mov  ecx,8008   ; local port # - http
372
    mov  edx,0      ; no remote port specified
373
    mov  esi,0      ; no remote ip specified
374
    mov  edi,0      ; PASSIVE open
375
    mcall
376
    mov  [socket], eax
377
    mov  [posy],1
378
    mov  [posx],0
379
    mov  [read_on],0
380
 
381
    call draw_window
382
 
383
    jmp  still
384
 
385
 
386
check_rate:
387
 
388
    pusha
389
 
390
    mov  eax,[bps]
391
    xor  edx,edx
392
    mov  ebx,8*100
393
    div  ebx
394
    shl  eax,1
395
    mov  [playadd],eax
396
 
397
    mov  eax,26
398
    mov  ebx,9
399
    mcall
400
 
401
    sub  eax,[transmission_start]
402
    shr  eax,1
403
 
404
    imul eax,[playadd]
405
 
406
    mov  edx,0x00dd00
407
 
408
    cmp  [sentbytes],eax
409
    jge  sendok
410
 
411
    sub  eax,20000
412
    cmp  [sentbytes],eax        ; a long buffer underrun correction
413
    jge  no_buffer_overrun      ; actually leads to overrun
414
    mov  [sentbytes],eax
415
  no_buffer_overrun:
416
 
417
    add  [playadd],150
418
    mov  edx,0xdd0000
419
 
420
  sendok:
421
 
422
    mov  eax,13
423
    mov  ebx,320*65536+10
424
    mov  ecx,105*65536+10
425
    mcall
426
 
427
    mov  eax,47
428
    mov  ebx,4*65536
429
    mov  ecx,[playadd]
430
    mov  edx,322*65536+106
431
    mov  esi,0x000000
432
;    mcall
433
 
434
    popa
435
 
436
    ret
437
 
438
 
439
show_progress:
440
 
441
    pusha
442
 
443
    mov  eax,13
444
    mov  ebx,236*65536+10*6
445
    mov  ecx,107*65536+8
446
    mov  edx,0xffffff
447
    mcall
448
 
449
    mov  ecx,[fileinfo+4]
450
    imul ecx,512
451
 
452
    mov  eax,47               ; file read
453
    mov  ebx,9*65536
454
    mov  edx,236*65536+107
455
    mov  esi,0x000000
456
    mcall
457
 
458
    popa
459
    ret
460
 
461
 
462
playpos  dd  0x100000
463
playadd  dd  256000 / 8 / 100
464
 
465
 
466
send_header:
467
 
468
    pusha
469
 
470
    mov   [playpos],0x40000
471
 
472
    mov   esi,fileinfo+5*4
473
    mov   edi,transname
474
    mov   ecx,30
475
    cld
476
    rep   movsb
477
 
478
    mov   eax, 53
479
    mov   ebx, 7
480
    mov   ecx, [socket]
481
    mov   edx, headere-headers
482
    mov   esi, headers
483
    mcall
484
 
485
    popa
486
    ret
487
 
488
 
489
read_file:
490
 
491
    cmp  [read_to],0x40000+2000
492
    jg   cache_ok
493
    mov  [read_on],1
494
  cache_ok:
495
 
496
    cmp  [read_to],0x40000+95500
497
    jg   no_read_1
498
 
499
    mov  [fileinfo+12],eax
500
    mov  [fileinfo+8],ebx
501
 
502
    mov  eax,58
503
    mov  ebx,fileinfo
504
    mcall
505
 
506
    cmp  eax,0
507
    jne  no_read_1
508
 
509
    mov  eax,[fileinfo+8]
510
    add  [fileinfo+4],eax
511
 
512
    add  [read_to],512*2
513
 
514
    ret
515
 
516
  no_read_1:
517
 
518
    mov  [read_on],0
519
 
520
    ret
521
 
522
 
523
 
524
check_for_incoming_data:
525
 
526
    pusha
527
 
528
    mov  eax, 53
529
    mov  ebx, 2
530
    mov  ecx, [socket]
531
    mcall
532
 
533
    cmp  eax,0
534
    je   _ret_now
535
 
536
  new_data:
537
 
538
    mov  eax, 53
539
    mov  ebx, 2
540
    mov  ecx, [socket]
541
    mcall
542
 
543
    cmp  eax,0
544
    je   _ret
545
 
546
    mov  eax,53
547
    mov  ebx,3
548
    mov  ecx,[socket]
549
    mcall
550
 
551
    cmp  bl,10
552
    jne  no_lf
553
    inc  [posy]
554
    mov  [posx],0
555
    jmp  new_data
556
  no_lf:
557
 
558
    cmp  bl,20
559
    jb   new_data
560
 
561
    inc  [posx]
562
    cmp  [posx],60
563
    jbe  xok
564
    inc  [posy]
565
    mov  [posx],0
566
  xok:
567
 
568
    cmp  [posy],12
569
    jbe  yok
570
    mov  [posy],1
571
  yok:
572
 
573
    mov  eax,[posy]
574
    imul eax,60
575
    add  eax,[posx]
576
 
577
    mov  [input_text+eax],bl
578
 
579
    jmp  new_data
580
 
581
  _ret:
582
 
583
;    call draw_window
584
 
585
  _ret_now:
586
 
587
    popa
588
    ret
589
 
590
 
591
 
592
check_connection_status:
593
 
594
    pusha
595
 
596
    mov  eax, 53
597
    mov  ebx, 6
598
    mov  ecx, [socket]
599
    mcall
600
 
601
    cmp  eax,[status]
602
    je   .ccs_ret
603
    mov  [status],eax
604
    add  eax,48
605
    mov  [text+20],al
606
    call draw_window
607
   .ccs_ret:
608
 
609
    popa
610
    ret
611
 
612
 
613
 
614
 
615
;   *********************************************
616
;   *******  WINDOW DEFINITIONS AND DRAW ********
617
;   *********************************************
618
 
619
 
620
draw_window:
621
 
622
    pusha
623
 
624
    mov  eax,12                    ; function 12:tell os about windowdraw
625
    mov  ebx,1                     ; 1, start of draw
626
    mcall
627
 
628
    mov  eax,0                     ; Draw Window
629
    mov  ebx,50*65536+410
630
    mov  ecx,100*65536+141
551 spraid 631
    mov  edx,0x14ffffff
485 heavyiron 632
    mov  edi,title
633
    mcall
634
 
635
    mov  eax,8                     ; Start server
636
    mov  ebx,(25)*65536+21
637
    mov  ecx,57*65536+10
638
    mov  edx,2
639
    mov  esi,0x409040
640
    mcall                      ; Stop server
641
;    mov  eax,8
642
    mov  ebx,(25)*65536+21
643
    mov  ecx,69*65536+10
644
    mov  edx,4
645
    mov  esi,0x904040
646
    mcall
647
 
648
    mov  esi,0x3366d0
649
 
650
;    mov  eax,8                     ; Enter filename
651
    mov  ebx,(25)*65536+21
652
    mov  ecx,93*65536+10
653
    mov  edx,6
654
    mcall
655
;    mov  eax,8                     ; Decrease transfer rate
656
    mov  ebx,(25)*65536+10
657
    mov  ecx,105*65536+10
658
;    mov  edx,8
659
    mcall
660
;    mov  eax,8                     ; Increase transfer rate
661
    mov  ebx,(36)*65536+10
662
    mov  ecx,105*65536+10
663
    mov  edx,9
664
    mcall
665
 
666
    mov  ebx,10*65536+35           ; draw info text
667
    mov  ecx,0x00000000
668
    mov  edx,text
669
    mov  esi,40
670
  newline:
671
    mov  eax,4
672
    mcall
673
    add  ebx,12
674
    add  edx,40
675
    cmp  [edx],byte 'x'
676
    jnz  newline
677
 
678
    mov  eax,4                     ; Filename
679
    mov  ebx,56*65536+95
680
    mov  ecx,0x000000
681
    mov  edx,filename
682
    mov  esi,30
683
    mcall
684
 
685
    mov  eax,[bps]
686
    xor  edx,edx
687
    mov  ebx,1000
688
    div  ebx
689
    mov  ecx,eax
690
 
691
    mov  eax,47
692
    mov  ebx,3*65536
693
    mov  edx,58*65536+107
694
    mov  esi,0x00000000
695
    mcall
696
 
697
    mov  [input_text+0],dword 'RECE'
698
    mov  [input_text+4],dword 'IVED'
699
    mov  [input_text+8],dword ':   '
700
 
701
    mov  ebx,230*65536+35           ; draw info text
702
    mov  ecx,0x00000000
703
    mov  edx,input_text
704
    mov  esi,28
705
    mov  edi,7
706
   newline2:
707
    mov  eax,4
708
    mcall
709
    add  ebx,10
710
    add  edx,60
711
    dec  edi
712
    jnz  newline2
713
 
714
    mov  eax,38
715
    mov  ebx,210*65536+210
716
    mov  ecx,22*65536+136
717
    mov  edx,0x6699cc ; 002288
718
    mcall
719
 
720
    mov  eax,38
721
    mov  ebx,211*65536+211
722
    mov  ecx,22*65536+136
723
    mov  edx,0x336699 ; 002288
724
    mcall
725
 
726
    mov  eax,12                    ; function 12:tell os about windowdraw
727
    mov  ebx,2                     ; 2, end of draw
728
    mcall
729
 
730
    popa
731
 
732
    ret
733
 
734
 
735
 
736
; DATA AREA
737
 
738
text:
739
   db '        TCB status: 0                   '
740
   db '                                        '
741
   db '        Activate - port 8008            '
742
   db '        Stop server                     '
743
   db '                                        '
744
   db '    >                                   '
745
   db '   < >      Kbps                        '
746
   db 'x';  <- END MARKER, DONT DELETE
747
 
748
headers:
749
 
750
  db   'ICY 200 OK',13,10
751
  db   'icy-notice1:This stream requires Winamp or xmms',13,10
752
  db   'icy-url:http://www.menuetos.org',13,10
753
  db   'icy-pub: 1',13,10
754
  db   'icy-name: Menuet Mp3 Shoutcast Radio ',version,' - '
755
 transname:
756
  db   '                              ',13,10,13,10
757
 
758
headere:
759
 
760
title  db   'MP3 shoutcast server ',version,0
761
 
762
socket   dd  0
763
status   dd  0
764
 
765
posy     dd  1
766
posx     dd  0
767
 
768
read_on  db  1
769
read_to  dd  0
770
 
771
addr     dd  0
772
ya       dd  0
773
 
774
bps      dd  128*1000
775
 
776
fileinfo:  dd  0,0,0,0,0x20000
539 spraid 777
filename:  db  '/sys/MENUET.MP3',0
485 heavyiron 778
times 50   db  0
779
 
780
input_text:
781
 
782
I_END: