File: ChangeLog

package info (click to toggle)
cynthiune.app 0.9.5-14
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd, wheezy
  • size: 2,780 kB
  • ctags: 855
  • sloc: objc: 12,746; ansic: 497; cpp: 156; makefile: 141
file content (3667 lines) | stat: -rw-r--r-- 149,238 bytes parent folder | download | duplicates (4)
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
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
2734
2735
2736
2737
2738
2739
2740
2741
2742
2743
2744
2745
2746
2747
2748
2749
2750
2751
2752
2753
2754
2755
2756
2757
2758
2759
2760
2761
2762
2763
2764
2765
2766
2767
2768
2769
2770
2771
2772
2773
2774
2775
2776
2777
2778
2779
2780
2781
2782
2783
2784
2785
2786
2787
2788
2789
2790
2791
2792
2793
2794
2795
2796
2797
2798
2799
2800
2801
2802
2803
2804
2805
2806
2807
2808
2809
2810
2811
2812
2813
2814
2815
2816
2817
2818
2819
2820
2821
2822
2823
2824
2825
2826
2827
2828
2829
2830
2831
2832
2833
2834
2835
2836
2837
2838
2839
2840
2841
2842
2843
2844
2845
2846
2847
2848
2849
2850
2851
2852
2853
2854
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872
2873
2874
2875
2876
2877
2878
2879
2880
2881
2882
2883
2884
2885
2886
2887
2888
2889
2890
2891
2892
2893
2894
2895
2896
2897
2898
2899
2900
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910
2911
2912
2913
2914
2915
2916
2917
2918
2919
2920
2921
2922
2923
2924
2925
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950
2951
2952
2953
2954
2955
2956
2957
2958
2959
2960
2961
2962
2963
2964
2965
2966
2967
2968
2969
2970
2971
2972
2973
2974
2975
2976
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987
2988
2989
2990
2991
2992
2993
2994
2995
2996
2997
2998
2999
3000
3001
3002
3003
3004
3005
3006
3007
3008
3009
3010
3011
3012
3013
3014
3015
3016
3017
3018
3019
3020
3021
3022
3023
3024
3025
3026
3027
3028
3029
3030
3031
3032
3033
3034
3035
3036
3037
3038
3039
3040
3041
3042
3043
3044
3045
3046
3047
3048
3049
3050
3051
3052
3053
3054
3055
3056
3057
3058
3059
3060
3061
3062
3063
3064
3065
3066
3067
3068
3069
3070
3071
3072
3073
3074
3075
3076
3077
3078
3079
3080
3081
3082
3083
3084
3085
3086
3087
3088
3089
3090
3091
3092
3093
3094
3095
3096
3097
3098
3099
3100
3101
3102
3103
3104
3105
3106
3107
3108
3109
3110
3111
3112
3113
3114
3115
3116
3117
3118
3119
3120
3121
3122
3123
3124
3125
3126
3127
3128
3129
3130
3131
3132
3133
3134
3135
3136
3137
3138
3139
3140
3141
3142
3143
3144
3145
3146
3147
3148
3149
3150
3151
3152
3153
3154
3155
3156
3157
3158
3159
3160
3161
3162
3163
3164
3165
3166
3167
3168
3169
3170
3171
3172
3173
3174
3175
3176
3177
3178
3179
3180
3181
3182
3183
3184
3185
3186
3187
3188
3189
3190
3191
3192
3193
3194
3195
3196
3197
3198
3199
3200
3201
3202
3203
3204
3205
3206
3207
3208
3209
3210
3211
3212
3213
3214
3215
3216
3217
3218
3219
3220
3221
3222
3223
3224
3225
3226
3227
3228
3229
3230
3231
3232
3233
3234
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248
3249
3250
3251
3252
3253
3254
3255
3256
3257
3258
3259
3260
3261
3262
3263
3264
3265
3266
3267
3268
3269
3270
3271
3272
3273
3274
3275
3276
3277
3278
3279
3280
3281
3282
3283
3284
3285
3286
3287
3288
3289
3290
3291
3292
3293
3294
3295
3296
3297
3298
3299
3300
3301
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
3317
3318
3319
3320
3321
3322
3323
3324
3325
3326
3327
3328
3329
3330
3331
3332
3333
3334
3335
3336
3337
3338
3339
3340
3341
3342
3343
3344
3345
3346
3347
3348
3349
3350
3351
3352
3353
3354
3355
3356
3357
3358
3359
3360
3361
3362
3363
3364
3365
3366
3367
3368
3369
3370
3371
3372
3373
3374
3375
3376
3377
3378
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388
3389
3390
3391
3392
3393
3394
3395
3396
3397
3398
3399
3400
3401
3402
3403
3404
3405
3406
3407
3408
3409
3410
3411
3412
3413
3414
3415
3416
3417
3418
3419
3420
3421
3422
3423
3424
3425
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446
3447
3448
3449
3450
3451
3452
3453
3454
3455
3456
3457
3458
3459
3460
3461
3462
3463
3464
3465
3466
3467
3468
3469
3470
3471
3472
3473
3474
3475
3476
3477
3478
3479
3480
3481
3482
3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508
3509
3510
3511
3512
3513
3514
3515
3516
3517
3518
3519
3520
3521
3522
3523
3524
3525
3526
3527
3528
3529
3530
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542
3543
3544
3545
3546
3547
3548
3549
3550
3551
3552
3553
3554
3555
3556
3557
3558
3559
3560
3561
3562
3563
3564
3565
3566
3567
3568
3569
3570
3571
3572
3573
3574
3575
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585
3586
3587
3588
3589
3590
3591
3592
3593
3594
3595
3596
3597
3598
3599
3600
3601
3602
3603
3604
3605
3606
3607
3608
3609
3610
3611
3612
3613
3614
3615
3616
3617
3618
3619
3620
3621
3622
3623
3624
3625
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
2006-03-31  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* GNUmakefile: release 0.9.5.

	* Player.m ([Player -readNextChunk:bufferwithSize:bufferSize]):
	return 0 if the code returned was 0 or less.

2006-03-28  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlaylistView.m ([PlaylistView -_selectionTopByExtendingIt:keep]) 
	([PlaylistView -_selectionBottomByExtendingIt:keep]): take
	selectionDir into account.

	* PlaylistController.m ([PlaylistController -updateStatusLabel]):
	made public.
	([PlaylistController -toggleShuffle:sender]): shuffle also if
	currentPlayerSong is not set.
	Adapted to new (closer) relationship with PlaylistViewController.

	* PlaylistViewController.m: removed setDelegate:, replaced it with
	the more appropriate "setPlaylistController" since we know for
	sure there will be one. Removed all the custom notifications from
	this class and invoke directly some new methods from the
	playlistController.

	* CynthiuneController.m ([CynthiuneController -awakeFromNib]): set
	the playlistWindow as the next responder for the playerWindow.

	* PlaylistView.m ([PlaylistView -performKeyEquivalent:event]):
	overload this method instead of keyDown: which is "lower-level"
	and is not invoked when the key event occurs when the focus is on
	another widget.
	([PlaylistView -_selectionUpByExtendingIt:keep]) 
	([PlaylistView -_selectionDownByExtendingIt:keep]) 
	([PlaylistView -_selectionTopByExtendingIt:keep]) 
	([PlaylistView -_selectionBottomByExtendingIt:keep]): invoke
	scrollRowToVisible: with the appropriate argument.

	* PlaylistController.m ([PlaylistController
	-playlistViewActivateSelection:view]): new method bound to the
	return key.
	([PlaylistController -playlistViewDeleteSelection:view]): new
	method bound to the delete key.

	* PlaylistViewController.m ([PlaylistViewController -playlistViewActivateSelection:view]) 
	([PlaylistViewController -playlistViewDeleteSelection:view]):
	added proxy methods transferring the call to PlaylistController.

	* PlaylistView.m ([PlaylistView -keyDown:event]): moved the
	keyboard handling here, replacing the one previously in
	CynthiuneController.

	* PlaylistViewController.m ([PlaylistViewController
	-selectSongsInArray:array]): removed the "extend" parameter.

2006-03-24  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* CynthiuneController.m ([CynthiuneController -keyPressed:event]):
	new method to fulfill the CynthiuneWindowDelegate protocol that
	handles known keypresses (the arrow keys + return + delete) before
	the responder API does it.

	* PlaylistController.m ([PlaylistController -selectPreviousSong:senderbyKeepingSelection:keep]) 
	([PlaylistController
	-selectNextSong:senderbyKeepingSelection:keep]): new method to
	manipulate the song selection in the playlist view externally.

	* PlaylistViewController.m ([PlaylistViewController
	-selectSongsInArray:arraybyExtendingSelection:extend]): added an
	"extend" parameter to this method to control whether the selection
	should be extended rather than implicitly doing it.

	* CynthiuneWindow.m ([CynthiuneWindow -keyDown:]): new subclass
	method to intercept keypresses before the API does.

	* SongInspectorController.m ([SongInspectorController -song]): new
	accessor method.

	* Song.m ([Song -_tagsClassesForProtocol:protocol]): method
	derived from its previous "_tagsClassForProtocol:" version. Now
	returning all the classes found as strings in an enumerator.
	([Song -_refreshSongInfos]): walk all the classes returned by
	_tagsClassesForProtocol: until one is found and does not return NO
	on the reading operation.
	([Song
	-setTitle:newTitleartist:newArtistalbum:newAlbumgenre:newGenretrackNumber:newTrackNumberyear:newYear]): same as above but for writing.

	* PlaylistController.m ([PlaylistController
	-cleanupPlaylist:sender]): if the song viewed in the song
	inspector is one of the invalid songs, stop viewing it.
	The repeat and shuffle buttons were removed from the toolbar and
	put on the player window instead, since those features really have
	to do with the player rather than with the playlist per se.

2006-03-22  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* SongInspectorController.m ([SongInspectorController
	-lookupThread]): set the mb label to an empty string whenever an
	error occurs so the user doesn't keep waiting.

	* MBResultsPanel.m ([MBResultsPanel
	-_createTableView:contentView]): added a column for the track number.

	* SongInspectorController.m ([SongInspectorController
	-lookupThread]): add song metadata to the parameters of the mb
	query so that their server can maybe return a more accurate
	result. Also, ask mb to use UTF8.

2006-03-21  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/ID3Tag/ID3Tag.m: bundle now conform to the TagsWriting
	protocol.

	* Bundles/Musepack/CNSFileHandle.m (CNSFileHandleCanSeek) 
	(CNSFileHandleSeek): those functions really should return an
	mpc_bool_t rather than a BOOL.

	* Bundles/Mod/Mod.m ([Mod
	-readNextChunk:bufferwithSize:bufferSize]): test the architecture
	endianness with cpp rather than at runtime.

	* Bundles/Musepack/Musepack.m ([Musepack
	-readNextChunk:bufferwithSize:bufferSize]): invoke
	invertBytesInBuffer on big endian architectures.

	* PlaylistView.[hm]: renamed module from PlaylistTableView.

	* Bundles/FLACTags/FLACTags.[hm]: new tags bundle for reading tags
	metadata from FLAC files.

	* Bundles/FLAC/FLAC.m: purge code that was there for tags reading,
	moved to FLACTags and modified.

	* PlaylistViewController.m ([PlaylistViewController
	-tableView:tableViewmouseDownInHeaderOfTableColumn:tableColumn]):
	don't do anything with the sort order if the number of songs in
	the list is < 1.

	* CynthiuneHeaderCell.m ([CynthiuneHeaderCell -widthOfText:text]):
	add the size of the arrow + its offset when computing this value.

	* CynthiuneSongTitleCell.m ([CynthiuneSongTitleCell
	-widthOfText:text]): add the size of the arrow + its offset when
	computing this value.

	* PlaylistViewController.[hm]: renamed module from
	TableViewController.

2006-03-20  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* TableViewController.m ([TableViewController
	-tableView:tableViewmouseDownInHeaderOfTableColumn:tableColumn]):
	changed algorithm so that we would use the column identifier and
	the sort order rather than the previous "sortedInPlaylist" and
	"sortedInDuration" bools.

	* CynthiuneHeaderCell.m ([CynthiuneHeaderCell -cellSize]): added
	the size of the arrow to the regular cell size so that sizeToFit
	has a better reference on how much size to prepare.

	* Playlist.m ([-sortByPlaylistRepresentation:reverseOrder]) 
	([Playlist -sortByDuration:reverseOrder]): use the "reverseOrder"
	parameter... in correct order.

2006-03-19  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Frameworks/Cynthiune/NSStringExtensions.m
	([-caseInsensitiveCompareContainingDirectory:aString]): removed
	method. Foundation's stringByDeletingLastPathComponent does the
	job for us.

2006-03-18  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Song.m ([Song -compareByPlaylistRepresentation:aSong]): modified
	the sort ordered so that two songs are first compared base on
	their parent directories.

	* Frameworks/Cynthiune/NSStringExtensions.m ([NSString
	-caseInsensitiveCompareContainingDirectory:aString]): new method
	to case-insensitively compare the dirname of two filenames.

2006-03-17  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Song.m ([Song -compareByPlaylistRepresentation:aSong]): modified
	the sort order so that the songs from the same album but from a
	different artist are still ordered by song number.

	* Bundles/aRts/aRts.m ([aRts -_launchServer]): new method to
	launch the artsd daemon if it's not running.

	* Bundles/OSS/OSSPreference.m ([OSSPreference
	-controlTextDidEndEditing:notification]): same as below.

	* Bundles/Esound/EsoundPreference.m ([EsoundPreference
	-controlTextDidEndEditing:notification]): this new delegate method
	replaces the old hostAction: and portAction: methods by modifying
	the value from the field that ended being modified. This
	replacement permits the user to no longer have to press return to
	validate its changes.

	* Bundles/Esound/Esound.m ([Esound -openDevice]): try five times
	to open the esound socket at 2/10th of seconds of interval to
	ensure the daemon is either started correctly or that it really
	failed.

2006-03-14  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlaylistController.m ([PlaylistController -_oPanelDidEnd:oPanelreturnCode:resultcontextInfo:contextInfo]) 
	([PlaylistController -_startOPanelDidEnd:oPanelreturnCode:resultcontextInfo:contextInfo]) 
	([PlaylistController -_ejectOPanelDidEnd:oPanelreturnCode:resultcontextInfo:contextInfo]) 
	([PlaylistController -_removeArrayOfSongs:array]) 
	([PlaylistController -removeAllSongs:sender]) 
	([PlaylistController -openSongFromNSApp:filename]):
	invoke invalidateSortedColumn on tableViewController.
	([PlaylistController -cleanupPlaylist:sender]): do something only
	if the amount of invalid songs reported is > 0.

	* CynthiuneHeaderCell.m
	([-drawInteriorWithFrame:cellFrameinView:controlView]): no longer
	use images to draw sort-order arrows, invoke the new
	_drawArrowOfSize:... (see below) instead.
	([CynthiuneHeaderCell
	-_drawArrowOfSize:arrowSizeatReferencePoint:refPoint]):
	draws an arrow using NSBezierPath.

	* TableViewController.m ([TableViewController
	-invalidateSortedColumn]): made method public. Invoke
	"setNeedsDisplay:" on the [playlistView headerView] to make sure
	we don't see any sorting indicator while the list is unsorted.

2006-03-12  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* TableViewController.m ([TableViewController -_saveSortOrderColumn:sortColumninDirection:sortDirection]) 
	([TableViewController -_restoreSortOrder]): added those two new
	methods to save the state of the sort order in the playlist and to
	restore it at launch time.
	([TableViewController -awakeFromNib]): removed the "scrollView"
	ivar which was only used here anyway.
	([TableViewController
	-tableView:tableViewmouseDownInHeaderOfTableColumn:tableColumn]):
	slightly optimized methods by reducing message calls and
	generalizing the variables.
	([TableViewController
	-tableView:tableViewacceptDrop:inforow:rowdropOperation:op]):
	call _invalidateSortedColumn after a drop.
	([TableViewController -_invalidateSortedColumn]): invalidate the
	ivars related to sorting as well as the header appearance and the
	state saved to the user defaults.

2006-03-11  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Frameworks/Cynthiune/NSColorExtensions.m ([NSColor +evenRowsBackgroundColor]),
	([NSColor +evenRowsBackgroundColor]): inverted the values returned
	by those methods to permit our tableview to display the stripes by
	taking into account the ones displayed by the Nesedah Camaelon theme.

	* Bundles/VorbisTags/VorbisTags.m: updated copyright.
	([VorbisTags
	+setTitle:titleartist:artistalbum:albumtrackNumber:trackNumbergenre:genreyear:yearofFilename:filename]): enabled writing to vorbis file through the code taken from Poe.app.

2006-03-02  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/MP3/MP3.m ([MP -streamOpen:fileName]): call _resetIvars
	from here instead of init.
	([-streamClose]): don't call _resetIvars from here.

	* PlaylistController.m ([PlaylistController -_initButtonImages]):
	added tooltips to the playlist toolbar buttons.

	* Player.m ([Player -setStream:newStream]): changed method
	definition to accept the stream to analyze as parameter instead of
	using the "stream" ivar.
	([Player -setStream:newStream]): set the "stream" ivar to
	newStream only after the channels and and sample rate were defined
	for it. This to avoid a crash when using a threaded output plugin
	([Player -stop]): if the output is threaded, send a stopThread
	message to the output plugin only if not paused, since this was
	putting us in an infinite loop (thread already stopped).

	* CynthiuneHeaderCell.[hm]: new class that displays an indicator
	of the state of the list sorting in the playlist table.

2006-02-28  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Frameworks/Cynthiune/NSColorExtensions.m ([NSColor
	+alternateSelectedControlTextColor]): the default selected text
	color modified to be visible under OSX with the orange/yellow
	background color we use in our NSTableView...

2006-02-25  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* CynthiuneController.m ([CynthiuneController -awakeFromNib]):
	apply resize increment of (1, 16) to playlistWindow.

2006-02-21  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/aRts/aRts.m ([aRts -threadLoop]): adapted to the new
	definition of the Output protocol.

	* Player.m ([Player -init]): new "closingThread" ivar, indicating
	whether the Output thread is closing.
	([Player -init]): new "streamsToClose" mutable array, containing
	streams to be closed when the Output thread is done using them.
	([Player -_closePendingStreams]): new method to be commanded from
	the Output thread through the main thread to clean up the
	streamsToClose array.
	([Player -readNextChunk:bufferwithSize:bufferSize]): if
	closingThread is set, stop waiting for "awaitingNewStream" to be
	set and do nothing else.

2006-02-19  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/WaveOut/WaveOut.m ([WaveOut -_loopIteration]): modified
	method to take the changes to the ParentPlayer informal protocol
	into account. Also, free the sound blocks with the new FreeBlock
	functions so as to also free the data chunk that was allocated
	with malloc.
	(FreeBlock): new method to correctly free the memory used by a
	WAVEHDR structure.

2006-02-17  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlaylistController.m ([PlaylistController -init]): new
	"notifiedFirstSong" ivar designed to remember the first song
	given by the PlaylistChangedNotification.
	([PlaylistController -playlistChanged:aNotification]): receive the
	first song given by the notification. If notifiedFirstSong is set,
	which means the process of feeding the playlist has not yet
	ceased, do nothing. Otherwise set it to the received song.
	([PlaylistController -tableFilenamesDropped:aNotification]):
	receive the TableFilenamesDroppedNotification from the
	TableViewController. Feed the playlist with the songs passed
	through the userInfo dict.
	([PlaylistController -_oPanelDidEnd:oPanelreturnCode:resultcontextInfo:contextInfo]) 
	([PlaylistController -_startOPanelDidEnd:oPanelreturnCode:resultcontextInfo:contextInfo]) 
	([PlaylistController -_ejectOPanelDidEnd:oPanelreturnCode:resultcontextInfo:contextInfo]) 
	([PlaylistController -openSongFromNSApp:filename]): handle song
	filenames to _feedPlaylistWithTreeOfFilenames: and take
	notifiedFirstSong ivar into account if the Player is not running.

	* TableViewController.m ([TableViewController
	-setDelegate:anObject]): declare new
	TableFilenamesDroppedNotification notification.
	([TableViewController -_bestFit:stringforColumn:column]): reduce
	the size of the string by 1 char if the string ends with a space.
	([TableViewController -_acceptDroppedFiles:aFilesListatRow:row]):
	no longer handles the song insertion into the playlist anymore,
	instead post a notification with the array of filenames to the
	observer.

	* Song.m ([Song -encodeWithCoder:encoder]): encode date only if
	not nil.

	* CynthiuneController.m ([CynthiuneController
	-_initPlaylistWindowButtons]): new method to hide the buttons from
	the Playlist window title bar.
	([CynthiuneController -_parseArguments]) 
	([CynthiuneController -application:applicationopenFile:filename]):
	pass the song filename as argument instead of a Song instance to
	PlaylistController's openSongFromNSApp: method.

	* GeneralPreference.m ([GeneralPreference -_initDefaults]):
	NSWindows are no longer textured by default.

	* CynthiuneSongTitleCell.m ([CynthiuneSongTitleCell -cellSize]):
	take the margins left and right to the image into account.
	([CynthiuneSongTitleCell
	-drawWithFrame:cellFrameinView:controlView]): use aFrame instead
	of imageFrame as argument to NSRectFill().

	* CynthiuneFadingTextField.m ([CynthiuneFadingTextField
	-awakeFromNib]): new method to add the fadeoutClone field to the
	parent view instead of in viewDidMoveToSuperview.
	([-viewDidMoveToSuperview]): removed method.

	* Frameworks/Cynthiune/NSColorExtensions.m ([NSColor +evenRowsBackgroundColor]) 
	([NSColor +oddRowsBackgroundColor]): balance the values for red
	and green to obtain a pure shade of blue.
	([NSColor +rowsHighlightColor]): use a softer orangish color.
	([NSColor +alternateSelectedControlColor]): work-around a bug in
	MacOSX where the rows are highlighted with a different color than
	specified for a fraction of a second.

	* Playlist.m ([Playlist -postNotificationWithSongAsFirst:song]):
	new method that post the PlaylistChangedNotification notification
	withs the song given as argument in the userInfo dictionary. So
	that the PlaylistController can now which song to point to when a
	new batch of songs is added.
	([Playlist -addSong:song], [Playlist -addSongsInArray:array]) 
	([Playlist -insertSong:songatIndex:index]): modified those methods
	to use the new method above.

	* Bundles/MacOSX/MacOSXPlayer.m (inputCallback): modified function
	to reflect to take the changes to the ParentPlayer informal
	protocol into account.

	* Frameworks/Cynthiune/Output.h: modified the ParentPlayer
	protocol to take account of the change below.

	* Player.m ([Player -readNextChunk:bufferwithSize:bufferSize]):
	new method derived from the obsolete readNextChunk that feeds the
	threaded player calling it with song data.

2006-02-16  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* InfoDisplayController.m ([InfoDisplayController -hide]): compute
	"hideInterval" from the interval and numberOfIterations method of
	the title text field.

2005-12-29  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlaylistArchiver.m ([PlaylistArchiver
	+_saveDictionaries:dictionariestoFile:filename]): standardize
	target directory name.

	* M3UArchiver.m ([M
	+fileContentFromDictionaries:dictionariesinReferenceDirectory:directorywithAbsoluteFilenameReferences:absolute]): use the playlist representation as metadata.

	* Song.m ([Song -setFilename:aFilename]): standardize path of
	filename given so that we are sure "filename" always point
	directly to the final file.
	([Song -initWithCoder:decoder]): same as above.
	([Song -encodeWithCoder:encoder]): encode the playlist
	representation for playlist file handlers which might make use of
	it.

2005-12-28  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/MP3/MP3.m ([MP -_resetIVars]): new "lostSyncs" ivar,
	defaulting to 0, meant to count the number of successive losses of
	frame syncs.
	(decodeInputBuffer): when a MAD_ERROR_LOSTSYNC occurs, compute the
	size mad has to skip and increase the lostSyncs ivar.

	* PlaylistController.m ([PlaylistController
	-_filteredSubtree:filename]): sort the resulting array before
	returning it.

2005-12-18  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Song.m ([Song -songInfosCanBeModified]): test whether the song
	file is writable.

	* SongInspectorController.m ([SongInspectorController
	-_setFieldsEditable:editable]): show or hide "lock.tiff" depending
	on whether the song metadata can or cannot be changed.

2005-12-14  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Song.m ([Song -openStreamForSong]): set status to SongOK
	whenever the stream could be opened.

2005-12-07  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* SongInspectorController.m ([SongInspectorController
	-lookupThread]): added code to check whether the TrmID is a the special
	"busy" one and if an error occured.

2005-11-30  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlaylistController.m ([PlaylistController
	-_initProgressSlider]): the new cell should recover the action and
	target from the old cell since the nib handler has set them
	beforehand.

2005-11-18  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* CynthiuneSliderCell.m ([CynthiuneSliderCell -init]): replaced
	knobImage with knobCell so that the drawing code is done within
	NSCell (more portable and easier way of doing things).
	([CynthiuneSliderCell -drawBarInside:cellFrameflipped:flipped]):
	no longer draw the control background since the cell is declared
	as non-opaque.
	([CynthiuneSliderCell -isOpaque]): declare the cell as non-opaque.

	* TableViewController.m ([TableViewController
	-tableView:tableViewobjectValueForTableColumn:tableColumnrow:rowIndex]): manage columns which have a non-nil identifier.

	* CynthiuneSlider.[hm]: removed module after it was found
	unnecessary to subclass NSSlider to obtain a custom look for the
	song slider.
	
	* CynthiuneController.m ([CynthiuneController -awakeFromNib]):
	request the PlaylistController instance to create an NSToolbar
	instance with itself as delegate. Also, made code related to
	window position clearer.

	* PlaylistController.m ([PlaylistController -toolbar:toolbaritemForItemIdentifier:itemIdentifierwillBeInsertedIntoToolbar:flag]) 
	([PlaylistController -toolbarAllowedItemIdentifiers:toolbar]) 
	([PlaylistController -toolbarDefaultItemIdentifiers:toolbar]): new
	NSToolbar delegate callback methods.
	([PlaylistController -_initToolbarButtons]): new method to
	instantiate our NSToolbarItem's.
	([PlaylistController
	-_toolbarButtonWithIdentifier:identifiercallbackToSelf:selectorandImageName:imageName]): new method containing common code for NSToolbarItem instantiation.
	([PlaylistController -playlistToolbar]): new public method that
	returns the NSToolbar instance which CynthiuneController should
	put on the playlist window. This toolbar totally replaces the
	previous dropdown menu system.

2005-11-02  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* CynthiuneSliderCell.m ([CynthiuneSliderCell
	-drawBarInside:cellFrameflipped:flipped]): use
	windowBackgroundColor instead of controlBackgroundColor to draw
	the background of the cell. This fixes a bug that would appear
	whenever the user colors were different than the regular system
	colors (at least on GNUstep).

2005-10-31  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* SongInspectorController.m ([SongInspectorController
	-_setFieldsEditable:editable]): also controls the aspect of
	lookupButton, also depending whether threadRunning is set or not.

	* PlaylistController.m ([PlaylistController
	-playerSongEnded:aNotification]): udpate the info display only
	after the player has stopped to avoid displaying the first song.

	* Bundles/Taglib/Taglib.[hm]: made this class conform to the
	TagsWriting protocol too.

	* Song.m ([Song -init]): replaced tagsClass with readingTagsClass
	and writingTagsClass.
	([Song -_tagsClassForProtocol:protocol]): renamed from
	_detectTagsClass. Modified to return a tags class conform to a
	specified protocol.
	([Song
	-setTitle:newTitleartist:newArtistalbum:newAlbumgenre:newGenretrackNumber:newTrackNumberyear:newYear]):
	new method replacing the individual set{artist, album, ...}
	methods and invoking the "setTitle..." method of the
	writingTagsClass with the values that were modified.

2005-10-25  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/VorbisTags/VorbisTags.m ([VorbisTags
	+_setString:stringtoComment:commentfromOvFile:ovFile]): fixed a
	segfault occuring when parsing an invalid vorbis file.

2005-10-24  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Song.m ([Song -songInfosCanBeModified]): returns "YES" if the
	tags class is not 'nil' and conforms to the new "TagsReading"
	protocol.

	* Frameworks/Cynthiune/Tags.h: splitted the "Tags" protocol in 2
	separate protocols: "TagsReading" and "TagsWriting".

2005-10-04  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Song.m ([Song -songInfosCanBeModified]): new dummy method always
	returning 'NO' (for the moment).

	* SongInspectorController.m ([SongInspectorController
	-_updateFields]): set fields editable and make the MB lookup
	button accessible only if [song songInfosCanBeModified] returns
	'YES'.

	* CynthiuneController.m ([CynthiuneController
	-applicationWillTerminate:notification]): invoke savePlayerState
	on the playlist controller.

	* PlaylistController.m ([PlaylistController -savePlayerState]):
	new method that saves the status of the repeat and shuffle modes
	as well as the number of the current song.
	([PlaylistController -awakeFromNib]): recover the state save in
	the preferences.

	* CynthiuneController.m ([CynthiuneController -init]): ensure the
	user's Cynthiune directory does exist so that the default playlist
	can be created and read.

2005-10-03  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Frameworks/Cynthiune/NSArrayExtensions.m ([NSMutableArray
	-addObjectRandomly:object]): modified to use srand() and rand()
	instead of srandom() and random().

2005-09-30  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Frameworks/Cynthiune/NSArrayExtensions.m ([NSMutableArray
	-addObjectRandomly:object]): raise an exception when 'object'
	parameter is nil.
	([NSMutableArray -rotateUpToObject:object]): method that rotates
	the array left until the object passed as parameter reaches the
	first position.

	* PlaylistController.m ([PlaylistController
	-tableDoubleClick:aNotification]): invoke "shuffleFromSong:" on
	playlist so that we make sure the shuffle list is rotated.
	([PlaylistController -toggleShuffle:sender]): if
	'currentPlayerSong' is set, place it at the first position in the
	shuffle list.

	* Playlist.m ([Playlist -shuffleFromSong:song]): new method called
	from PlaylistController when a song is double-clicked while the
	list is shuffled.
	([-reShuffle]): removed obsolete method.

2005-09-29  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Frameworks/Cynthiune/NSArrayExtensions.m ([NSMutableArray
	-addObjectRandomly:object]): new method that adds given object in
	a random position in the array.

2005-09-26  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/ASFTags/ASFTags.[hm]: new tags module for reading tags
	in ASF files.

	* Song.m ([Song -encodeWithCoder:encoder]): encode only fields
	which we are sure are non-nil.
	([Song -playlistRepresentation]): solved the case were the artist
	name could be nil and displayed as "(nil)".

2005-09-25  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/ID3Tag/ID3Tag.[hm]: new tags module for the id3tag tags
	library.

	* Frameworks/Cynthiune/Tags.h: new Tags protocol for tags module.

	* Bundles/Taglib/Taglib.[hm]: new tags module for the taglib tags
	library.

	* PlaylistController.m ([-toggleMute:sender]): removed method.
	([PlaylistController -_initButtonImages]): removed messages on the
	muteButton and muteMenuItem ivars (removed).

	* Player.m ([Player -init]): removed "muted" ivar.
	([Player -_playLoopIteration], [Player -readNextChunk]): no longer
	take the "muted" ivar into account since we removed the mute
	button.
	([-setMuted:aBool]): removed method.
	([-muted]): removed method.

2005-09-24  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Playlist.m ([Playlist -sortByDuration:reverseOrder]): reenabled
	method.
	([Playlist -sortByPlaylistRepresentation:reverseOrder]): reenabled
	method.

	* Frameworks/Cynthiune/NSStringExtensions.m ([NSString
	-linesFromFileContent]): new method that returns an array of
	strings representing the lines of the file represented by the
	receiver.

	* Frameworks/Cynthiune/utils.m (linesOfFile): removed function,
	replaced with "linesFromFileContent" method in class
	NSStringExtensions.

	* PlaylistArchiver.m ([PlaylistUnarchiver
	+dictionariesFromFilenames:filenames]): common method for playlist
	unarchivers which build list of dictionarycoders only from an
	array of filenames.

2005-09-23  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* M3UArchiver.m ([M +fileContentFromDictionaries:dictionariesinReferenceDirectory:directorywithAbsoluteFilenameReferences:absolute]): encode the filenames relatively if withAbsoluteFilenameReference: is set.
	([M +dictionariesFromFileContent:contentinReferenceDirectory:directory]): implemented decoding method.

	* PLSArchiver.m ([PLSArchiver
	+fileContentFromDictionaries:dictionariesinReferenceDirectory:directorywithAbsoluteFilenameReferences:absolute]): encode the filenames relatively if withAbsoluteFilenameReference: is set.
	([PLSUnarchiver
	+dictionariesFromFileContent:contentinReferenceDirectory:directory]): implemented decoding method.

	* PlaylistArchiver.m ([PlaylistArchiver
	+fileContentFromDictionaries:dictionariesinReferenceDirectory:directorywithAbsoluteFilenameReferences:absolute]): changed method signature to accept the additional "withAbsoluteFilenameReference:" boolean parameter.
	([PlaylistArchiver
	+fileContentFromDictionaries:dictionariesinReferenceDirectory:directorywithAbsoluteFilenameReferences:absolute]): new temporary method that separates a string in different substrings representing the lines of a file.

	* GeneralPreference.m ([GeneralPreference
	-absolutePlaylistReferences]): added method that returns YES if
	the filenames should be absolute in the playlist files.

	* PlaylistFile.[hm]: removed module. Made obsolete by the new
	playlist archiving mechanism.

2005-09-22  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Frameworks/Cynthiune/NSStringExtensions.[hm] ([NSString
	-relativePathFromDirectoryToFile:filename]): new method that
	returns the relative path to file with the current string as a
	directory reference.

2005-09-19  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlaylistArchiver.m ([PlaylistArchiver
	+fileContentFromDictionaries:
	inReferenceDirectory:]): changed method signature by adding a
	"directory" parameter which can serve as a reference for relative
	paths declared in playlist files.
	([PlaylistUnarchiver +dictionariesFromFileContent:
	inReferenceDirectory:]): changed method signature by adding a
	"directory" parameter which can serve as a reference for relative
	paths declared in playlist files.

2005-09-17  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlaylistArchiver.m: added a new class "PlaylistUnarchiver",
	implementing a subset of the NSKeyedUnarchiver API, requiring the
	method "dictionariesFromFileContent:" from subclasses.

	* PlaylistController.m ([-addSongsFolders:sender]): removed method.
	([PlaylistController -addSong:sender]): removed "+ dir" entry in
	the playlist submenu.
	([PlaylistController
	-_feedPlaylistWithTreeOfFilenames:filenames]): new method taking an
	array of filenames as parameter and which populate the playlist
	with song files, the content of subdirectories and the content of
	playlist files.

	* FormatTester.m ([FormatTester -extensionIsSupported:extension]):
	added "cPls" to the list of known extensions.
	([FormatTester -fileIsPlaylist:filename]): new method returning
	YES if the filename passed as parameter a playlist in a known
	format.

	* Playlist.m ([Playlist -deleteAllSongsQuietly]): new method
	designed to remove all songs from the playlist without raising a
	notification.

2005-09-11  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Song.m ([Song -_readInfos]): set duration to 0 seconds when
	status is not SongOK.

	* PlaylistController.m ([PlaylistController +initialize]): new
	method, computing the value for the default playlist filename.
	([PlaylistController -awakeFromNib]): invoke loadFromFile on the
	playlist with the default playlist filename given as parameter,
	in place of the obsolete loadFromDefaults method.
	([PlaylistController -playlistChanged:aNotification]): save the
	list to the default playlist file.
	([PlaylistController -songInspectorDidUpdateSong:aNotification]):
	save the list to the default playlist file.

	* Playlist.m ([Playlist -saveToFile:file]): compare file extension
	case-insensitively.
	([Playlist -loadFromFile:file]): first implementation currently
	supporting NSKeyedUnarchiver only. This allows us to save and load
	default playlists again.

2005-09-09  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* M3UArchiver.m ([M3UArchiver
	+fileContentFromDictionaries:dictionaries]): new method mostly
	taken from the old PlaylistFile's _M3UContent method.

	* PLSArchiver.m ([PLSArchiver
	+fileContentFromDictionaries:dictionaries]): new method mostly
	taken from the old PlaylistFile's _PLSContent method.

	* PlaylistArchiver.m: new class module implementing a subset of
	the NSKeyedArchiver API and most of the common code needed for its
	concrete subclasses. Currently, only the method
	"fileContentFromDictionaries:" is required.

	* M3UArchiver.m, PLSArchiver.m: subclassed from PlaylistArchiver
	because of common code.

2005-09-06  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* DictionaryCoder.m ([DictionaryCoder -encodeObject:anObject:aKey]) 
	([DictionaryCoder -encodeBool:aBool:aKey]) 
	([DictionaryCoder -encodeInt:anInteger:aKey])
	([DictionaryCoder -encodeInt64:anInteger:aKey]): added encoding
	methods needed to save playlist state.
	([DictionaryCoder -decodeObjectForKey:aKey]) 
	([DictionaryCoder -decodeBoolForKey:aKey]) 
	([DictionaryCoder -decodeIntForKey:aKey]): 
	([DictionaryCoder -decodeInt64ForKey:aKey]): added decoding
	methods needed to save playlist state.

2005-09-05  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* DictionaryCoder.[hm]: new module that implements a minimal
	subclass of NSCoder to store song data in a dictionary. This, in
	order to use the NSCoding protocol of the Song class.

2005-09-04  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* M3UArchiver.[hm]: new module to implement a subset of the
	NSKeyedArchiver API that ouputs the relevant object data into a
	M3U-formatted playlist file.

	* PLSArchiver.[hm]: new module to implement a subset of the
	NSKeyedArchiver API that ouputs the relevant object data into a
	PLS-formatted playlist file.

	* Playlist.m ([-saveToDefaults]): removed obsolete method.
	([-loadFromDefaults]): removed obsolete method.
	([Playlist -saveToFile:file]): reimplemented method by choosing an
	archiver Class depending on the file extension given as parameter.

2005-08-19  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Player.m ([Player -timer]): make sure rate and channels are not
	0 before using them in the quotient.

2005-07-06  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/WaveOut/WaveOut.m ([WaveOut -_freeBlocks]): stop the
	loop when no blocks are left allocated.

	* Bundles/MP3/MP3.m ([MP -streamOpen:fileName]) 
	([MP +streamTestOpen:fileName]): open the file with "b" mode flag
	set so that we make sure Windows opens it in binary-mode.

	* Bundles/WaveOut/WaveOut.[hm]: new threaded output bundle for the
	standard Windows sound api.

	* Bundles/MP3/MP3.m (testMP3Header): u_int16_t type changed to
	unsigned short for portability.

2005-06-26  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Player.m ([Player -setStream:newStream]): release the previous
	stream after the new one is made current, so that player threads
	can't crash the application when reading a potentially closed
	stream.

	* CynthiuneSliderCell.m ([CynthiuneSliderCell
	-drawBarInside:cellFrameflipped:flipped]): use
	"controlShadowColor" instead of "shadowColor".

2005-06-24  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Player.m ([Player -init]): new outputIsThreaded ivar to modify
	our behaviour depending on whether the output bundle is declared
	as threaded or not. Removed the "requests" ivar, considered
	useless.
	([Player -_handleEndOfSong]): new method that post a song-ended
	notification in the main thread from the new "readNextChunk"
	method.
	([Player -readNextChunk]): new method designed to feed threaded
	output bundles with data on request. Manage the end of songs.
	([Player -setPaused:aBool]): start or stop the thread of the
	threaded output bundles.

	* Bundles/aRts/aRts.[hm]: new threaded output bundle for the aRts
	sound daemon.

2005-06-21  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/MP3/MP3.m ([MP -seek:aPos]): compute a float to use as
	the multiplaction factor to find the correct position in the file.
	This solves a problem occuring due to the lack of precision with
	integer divisions.

2005-06-19  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* CynthiuneSliderCell.m ([CynthiuneSliderCell -init]): the new
	default image for the slider knob is named "slider-knob-disabled".
	([CynthiuneSliderCell -setEnabled:enabled]): if enabled, set the
	image to "slider-knob-enabled".
	([CynthiuneSliderCell -drawBarInside:cellFrameflipped:flipped]):
	slider trail is one line wider.

	* Frameworks/Cynthiune/NSTimerExtensions.[hm]: new extension module
	to the NSTimer class, providing a new method "explode", which
	registers the current timer in the current runloop both for the
	NSEventTrackingRunLoopMode and the NSDefaultRunLoopMode.

	* PlaylistController.m ([PlaylistController -_startTimeTimer]):
	execute first iteration of _updateTimeDisplay. Don't retain the
	timer.
	([PlaylistController -_stopTimeTimer]): don't release the timer
	since it's no longer retained.
	([PlaylistController -startPlayer:sender]): check if song != nil
	instead of currentPlayerSong prior to start the player.

	* InfoDisplayController.m ([InfoDisplayController -_reallyHide]):
	hide the timer when the splash is hidden.

	* GoomView.[hm]: new subclass of NSView with support for the goom
	animation library.

2005-06-15  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* TableViewController.m ([TableViewController
	-_bestFit:stringforColumn:column]): check that the length of the
	string is not >3, otherwise the call to NSMakeRange will generate
	an exception. Besides, also computes the width of the string by
	invoking the new [NSCell -widthOfText:] method.

	* MBResultsPanel.m ([MBResultsPanel -_sizeOfText:inCell:]): moved
	into the NSCellExtensions module.
	([MBResultsPanel -_updateColumnWidth:key]): updated following the
	above change.

	* Frameworks/Cynthiune/NSCellExtensions.m ([NSCell
	-widthOfText:text]): new method that returns the size the text
	passed as parameter would take in that NSCell.

	* Frameworks/Cynthiune/NSCellExtensions.[hm]: new extension module
	to the NSCell class.

2005-06-13  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* SongInspectorController.m ([SongInspectorController
	-setDelegate:anObject]): declare the new
	SongInspectorDidUpdateSongNotification to the notification center.
	([SongInspectorController -save:sender]): notifies the observer
	that the song metadata was modified.
	([SongInspectorController
	-_updateInfoField:fieldwithString:string]): new method that
	returns true if the new string value of a text field has changed,
	or false otherwise.
	([SongInspectorController
	-_updateFieldsWithTrackInfos:trackInfos]): new method that
	modifies the info fields with the data contained in the dictionary
	passed as parameter.
	([SongInspectorController -_updateSongFields:allTrackInfos]): new
	method that updates the fields when one song track was returned or
	pops up a MBResultsPanel when it was more than one.
	([SongInspectorController -readMB:mbtrack:track]): new method that
	transforms the data received from MusicBrainz into an
	NSDictionary.
	([SongInspectorController -_parseMB:mb]): method redesigned to
	call the above.
	([SongInspectorController
	-resultsPanelDidEndWithTrackInfos:trackInfo]): new delegate method
	for the MBResultsPanel that updates the info fields with the data
	from the song track that was selected.

	* PlaylistController.m ([PlaylistController
	-songInspectorDidUpdateSong:aNotification]): new delegate method
	to update the table view whenever the song inspector notifies us
	of a change in the song metadata. Optionnally update the
	infodisplay if the player is currently playing the song that was
	just modified.

	* TableViewController.m ([TableViewController -tableView:tableViewwillDisplayCell:cellforTableColumn:tableColumnrow:rowIndex]) 
	([TableViewController -_addNeededColumns]): use the standard
	colors defined in our new NSColorExtensions extension module.

	* Frameworks/Cynthiune/NSColorExtensions.m ([NSColor
	+evenRowsBackgroundColor]): new extension module for NSColor
	designed to provide methods for standard colors of rows in our
	NSTableViews.

	* Bundles/WindowsMedia/WindowsMedia.m
	(extractValueFromDescriptor): treat data of type "BYTE_ARRAY" as a
	cString rather than a unicode string.

	* MBResultsPanel.[hm]: new subclass of NSPanel, designed to be
	called by the SongInspectorController when MusicBrainz returns
	more than one result. Displays a list of all the song data that
	were returned, permitted the user to select the one that fits
	best with the one of which he's modifying the info.

2005-06-11  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Tests/Cynthiune_framework/TestNSNumberExtensions.m
	([TestNSNumberExtensions -testTimeStringValue]): added test for
	the timeStringValue extension method to NSNumber.

	* InfoDisplayController.m ([-resetTimerField]) 
	([-setTimerFromTotalSeconds:totalSeconds]): removed those methods
	made useless by the new mechanism used to display the total time
	of the playlist in its own window.

	* TableViewController.m ([TableViewController -deselectAll]): new
	proxy method that calls "deselectAll:" on playlistView.
	([TableViewController -durationOfSelection]): new method that
	returns the total duration of the selected songs as an NSNumber.
	([TableViewController -selectSongsInArray:array]): new method to
	select the songs passed as parameters in the array.
	([TableViewController -setCurrentPlayerSong:newSong]): new method
	to declare the song that is currently playing so that the song
	pointer can be positioned.
	([TableViewController -init]): initializes evenRowsBgColor and
	oddRowsBgColor so that the rows are differenciated more easily.

	* Frameworks/CynthiuneTest/SuperMetaClass.[hm]: new super class
	for all meta objects used in the unit tests. This class implements
	neutral "meta<ivar>" accessors for classes which wouldn't provide
	them or which would provide non-neutral accessors (i.e. accessors
	that perform actions different than just setting the related
	ivar).

	* BundleManager.m ([BundleManager _registerArrayOfClasses]):
	removed method.
	([BundleManager
	-loadBundlesForPath:pathwithFileManager:fileManager]): replaced
	the mechanism that was invoking "bundleClasses" on the main bundle
	classes with one that loads the bundle after "self" is passed as
	observer for the "NSBundleDidLoadNotification", hence invoking the
	new "bundleDidLoad:" method.
	([BundleManager -bundleDidLoad:notification]): new method that
	register the bundle classes by examining the "NSLoadedClasses" key
	of the userInfo dictionary of the notification, removing the need
	for a "bundleClasses" method in the "CynthiuneBundle" protocol.

	* Tests/Cynthiune_app/TestBundleManager.m ([TestBundleManager
	-testRegisterBundle]): removed test.
	([TestBundleManager -testBundleManager]): removed test.

	* Frameworks/Cynthiune/NSArrayExtensions.m ([NSArray
	-numberOfValuesBelowValue:value]): new method that returns the
	amount of values contained in self (considered as an array of
	numbers) that are inferior to the value passed as parameter.

	* Tests/Cynthiune_framework/TestNSArrayExtensions.m
	([TestNSArrayExtensions -testNumberOfValuesBelowValue]): test for
	the new "numberOfValuesBelowValue:" method.

	* Frameworks/Cynthiune/NSArrayExtensions.m ([NSMutableArray
	-moveObjectsAtIndexes:indexestoIndex:index]): renamed from
	"moveObjectsAtIndices:toIndex:".

	* Frameworks/Cynthiune/NSIndexSetExtensions.[hm]: removed
	extension module since only MacOSX 10.3 and above provide
	NSIndexSet.

2005-06-05  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/MP3/MP3.m ([MP -streamOpen:fileName]): rewind the file
	handle after reading the metadata, so that the beginning is the
	sound won't be clipped.
	([MP +bundleClasses], [MP +bundleDescription]) 
	([MP +bundleCopyrightStrings]): changes to the CynthiuneBundle
	protocol.

	* German.lproj/: added German translation, thanks to Julian Frede.

	* Frameworks/Cynthiune/CynthiuneBundle.h: removed the
	"bundleClasses" method, added bundleDescription and
	bundleCopyrightStrings.

2005-05-31  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* BundleManager.[hm]: new class that will handle bundle loading,
	registration and general management.

	* Tests/Cynthiune_app/TestBundleManager.m ([TestBundleManager
	-testNew]): unit test for the new BundleManager class.

2005-05-22  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlaylistTableView.m
	([-draggingSourceOperationMaskForLocal:isLocal]): returns
	NSDragOperationMove | NSDragOperationGeneric explicitly when
	isLocal is YES.

	* Player.m ([Player -setStream:newStream]): no longer care for the
	validity of the stream given as parameter since the
	PlayerController should take care of that.

	* GeneralPreference.m ([GeneralPreference -_initializeSelector]):
	invoke "sizeToFit" and "centerViewHorizontally" on the bundle
	selector.

	* Playlist.m ([Playlist -arrayOfInvalidSongs]): new method that
	replaces delteInvalidSongs by letting the caller invoke
	deleteSongsInArray: with the resulting array.

	* Tests/Cynthiune_framework/TestNSStringExtensions.m
	([TestNSStringExtensions -_createroDir]): new unit tests for our
	NSString extensions.

	* Bundles/WindowsMedia/WindowsMedia.m ([WindowsMedia -readYear]):
	new method required by the Format protocol.
	([NSString +stringWithASFText:textlength:length]): new extension
	method to NSString that parses an UTF-16 field from the ASF headers.
	(convertGUID): convert a binary-stoded GUID to its ASCII
	representation.
	(objectIsOfType): test whether an ASF object matches a specific
	GUID.
	(asfstrndup): strndup for UTF-16 strings.
	(readMetaData): new function to parse ASF header for song
	metadata.

	* Bundles/Timidity/Timidity.m ([Timidity -readTrackNumber]): new method
	required by the Format protocol.

	* Bundles/Ogg/Ogg.m ([Ogg -readYear]): new method
	required by the Format protocol.

	* Bundles/Musepack/Musepack.m ([Musepack -readYear]): new method
	required by the Format protocol.
	[generic] modified to use the new libmpcdec API (rather than
	libmusepack 1.1, which was C++ only).

	* Bundles/Mod/Mod.m ([Mod -readYear]): new method required by
	the Format protocol.

	* Bundles/MP3/MP3.m ([MP -readYear]): new method required by
	the Format protocol.
	([MP -_readStreamMetaData]): modified to take info from the Xing
	header if present and to compute the length of possible non-xing
	vbr files by doing an average for 10 frames.

	* Bundles/FLAC/FLAC.m ([FLAC -readYear]): new method required by
	the Format protocol.

	* Bundles/AudioFile/AudioFile.m ([AudioFile -readYear]): new
	method required by the Format protocol.

	* CynthiuneFadingTextField.[hm]: new subclass of NSTestField that
	gives a fading effect when the text value changes.

	* CynthiuneAnimatedImageView.[hm]: new subclass of NSImageView to
	display a small animation.

	* Frameworks/Cynthiune/utils.m (logRect): modified to use
	NSStringFromRect.
	(fileIsAcceptable): enhanced (fixed) to handle relative symlinks.

	* Frameworks/Cynthiune/Format.h: modified the Format protocol so
	that is requires a readYear method.

	* Frameworks/Cynthiune/NSViewExtensions.m ([NSView
	-arrangeViewRightTo:view]): new extension methods for the NSView
	class: arrangeViewRightTo:, arrangeViewLeftTo: and
	centerViewHorizontally.

	* Song.m ([Song -setTitle:string], [Song -setArtist:string]) 
	([Song -setAlbum:string], [Song -setGenre:string]) 
	([Song -setTrackNumber:string], [Song -setYear:string]): new
	setter methods for use by the new SongInspectorController.
	([Song -_refreshSongInfosFromStream:stream]): when a song doesn't
	have a title, generate it from the new makeTitleFromFilename
	utility function.

	* Song.h: new year ivar that will contain the year of publication
	for the song.

2005-05-06  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Playlist.m ([Playlist -addSongsInArray:array]) 
	([Playlist -deleteSongsInArray:array]) 
	([Playlist -deleteInvalidSongs], [-lastValidSong]) 
	([-firstValidSong], [-duration]): replaced the method for
	accessing the songs in the list array with an enumerator.
	([Playlist -_nextValidSongInEnumerator:songEnumerator]): new
	method with common code from firstValidSong and lastValidSong,
	taking an NSEnumerator as parameter, previously computed from
	their calling method as appropriate.

2005-05-05  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Playlist.m ([Playlist -replaceSongsWithArray:array]): new method
	that replaces the content of the playlist with the songs contained
	in the array passed as parameter.

	* Tests/Cynthiune_app/TestPlaylist.m ([TestPlaylist
	-testReplaceSongsWithArray]): added unit test for the new
	replaceSongsWithArray: method.

2005-04-17  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Playlist.m ([Playlist -firstValidSong]): new method that returns
	the first song marked as valid in the playlist.
	([Playlist -lastValidSong]): new method that returns the last song
	marked as valid in the playlist.

	* Tests/Cynthiune_app/TestPlaylist.m ([TestPlaylist
	-testFirstValidSong]): added unit test for the new firstValidSong
	method.
	([TestPlaylist -testLastValidSong]): added unit test for the new
	lastValidSong method.

	* Playlist.m ([Playlist -addSongsInArray:array]): new method that
	adds the songs contained in the NSArray passed as parameter.

	* Tests/Cynthiune_app/TestPlaylist.m ([TestPlaylist -testAddSongsInArray]) 
	added unit test for the new addSongsInArray: method.

2005-04-05  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Tests/Cynthiune_app/Meta*.[hm]: generated meta objects
	automatically from a perl script. Those meta objects have the
	abilitity to query their ivars through "metaXX" methods which
	guarantee no influence on them. All of those classes are
	subclasses of SuperMetaClass.

2005-03-28  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Playlist.m ([Playlist
	-moveSongsAtIndices:indicestoIndex:index]): moved the core of the
	method to
	Frameworks/Cynthiune/NSArrayExtensions.m:moveObjectsAtIndices:toIndex:.
	We now call that method instead and only check whether the list
	has changed and if we should raise a notification.

	* Frameworks/Cynthiune/NSArrayExtensions.m ([NSMutableArray
	-moveObjectsAtIndices:indicestoIndex:index]): new method, moved
	from ../../Playlist.m:moveSongsAtIndices:toIndex:, that move
	objects indicated in the specified array indexes to the new index.

	* Tests/Cynthiune_framework/TestNSArrayExtensions.m
	([TestNSMutableArrayExtensions -testMoveObjectsAtIndicesToIndex]):
	added unit test for the new moveObjectsAtIndices:toIndex: method.

	* Frameworks/Cynthiune/NSIndexSetExtensions.m ([NSIndexSet
	-adjustedIndexAfterMove:index]): new method, moved from
	../../Playlist.m:_adjustedIndexAfterMove, that returns the offset
	an index should be shifted after the move of the specified
	indexes occurs.

	* Tests/Cynthiune_framework/TestNSIndexSetExtensions.m
	([TestNSIndexSetExtensions -testAdjustedIndexAfterMove]): added
	unit test for the new adjustedIndexAfterMove: method.

	* Playlist.m ([Playlist -validSongBefore:song]): new method,
	similar to songBefore: but that will only return the first valid
	song that is found.
	([Playlist -validSongAfter:song]): new method,
	similar to songAfter: but that will only return the first valid
	song that is found.

	* Tests/Cynthiune_app/TestPlaylist.m ([TestPlaylist
	-testValidSongAfter]): added unit test for the validSongAfter:
	method.
	([TestPlaylist -testValidSongBefore]): added unit test for the
	validSongBefore: method.

2005-02-17  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Playlist.m ([Playlist
	-moveSongsAtIndices:indicestoIndex:index]): new method that moves
	a set of songs (contiguous or not) to the index passed as
	parameter.

	* Tests/Cynthiune_app/TestPlaylist.m ([TestPlaylist
	-testMoveSongsAtIndicesToIndex]): added unit test for the
	moveSongsAtIndices:toIndex: method.

2005-02-16  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Frameworks/Cynthiune/NSArrayExtensions.m ([NSArray
	-subarrayWithObjectsAtIndexes:indexSet]): new method that creates
	a subarray of the current array with the elements indexed in the
	indexset passed as parameter.

	* Tests/Cynthiune_framework/TestNSArrayExtensions.m
	([TestNSArrayExtensions -testSubarrayWithObjectsAtIndexes]): added
	unit test for the subarrayWithObjectsAtIndexes method.

	* Tests/Cynthiune_framework/TestNSArrayExtensions.[hm]: new
	TestCase module for the NSArrayExtensions module in the
	Cynthiune framework.

	* Frameworks/Cynthiune/NSIndexSetExtensions.m ([NSMutableIndexSet
	-addIndexesInArray:array]): new method that add the indexes found
	in the NSNumber objects contained in the array passed as
	parameter.

	* Frameworks/Cynthiune/NSIndexSetExtensions.[hm]: new module
	containing extension methods to the NSIndexSet and
	NSMutableIndexSet classes.

	* Tests/Cynthiune_framework/TestNSIndexSetExtensions.m
	([TestNSIndexSetExtensions -testAddIndexesInArray]): added unit
	test for the addIndexesInArray method.

	* Tests/Cynthiune_framework/TestNSIndexSetExtensions.[hm]: new
	TestCase module for the new NSIndexSetExtensions module in the
	Cynthiune framework.

	* SongInspectorController.m ([SongInspectorController -dealloc]):
	added this method to remove the observer from the
	NSNotificationCenter whenever the SongInspectorController instance
	is freed. Otherwise, the playlistChanged: notification can still
	be posted across different instances.

	* Player.m ([Player -dealloc]): added this method to remove
	the observer from the NSNotificationCenter whenever the Player
	instance is freed. Otherwise, the playlistChanged: notification
	can still be posted across different instances.

	* Playlist.m ([Playlist -dealloc]): added this method to remove
	the observer from the NSNotificationCenter whenever the Playlist
	instance is freed. Otherwise, the playlistChanged: notification
	can still be posted across different instances.
	([Playlist -addSong:song]) 
	([Playlist -insertSong:songatIndex:index]) 
	([Playlist -deleteSong:song], [Playlist -deleteAllSongs]) 
	([Playlist -deleteSongsInArray:array]) 
	([Playlist -deleteInvalidSongs]): added code to post the
	playlistChanged: notification when the list has at least one song
	added or removed.

	* Tests/Cynthiune_app/TestPlaylist.m ([TestPlaylist -testAddSong]) 
	([TestPlaylist -testInsertSongAtIndex]) 
	([TestPlaylist -testDeleteSong]) 
	([TestPlaylist -testDeleteAllSongs]) 
	([TestPlaylist -testDeleteInvalidSongs]) 
	([TestPlaylist -testDeleteSongsInArray]): ensure the corresponding
	methods post a playlistChanged: notification when something has
	changed in the list.

	* Playlist.m ([Playlist -setDelegate:object]): new method to
	remember the object that will receive the playlistChanged:
	notification message.
	([Playlist -insertSong:songatIndex:index]): new wrapper method
	around the insertObject:atIndex: method from NSMutableArray.
	([Playlist -indexOfSong:song]): new wrapper method around the
	indexOfObject: method from NSArray.

	* Tests/Cynthiune_app/TestPlaylist.m ([TestPlaylist
	-testSetDelegate]): added unit test for the setDelegate method.
	([TestPlaylist -testInsertSongAtIndex]): added unit test for the
	insertSongAtIndex method.
	([TestPlaylist -testIndexOfSong]): added unit test for the
	indexOfSong method.

2005-02-15  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Playlist.m ([Playlist -deleteSongsInArray:array]): new method
	deleting the songs contained in an array passed as parameter.
	([Playlist -deleteInvalidSongs]): new method that checks that all
	songs in the playlist have a status equal to "SongOK" and removes
	them otherwise.
	([Playlist -songAtIndex:index]): returns the Song specified by the
	index passed as parameter.

	* Tests/Cynthiune_app/TestPlaylist.m ([TestPlaylist
	-testDeleteInvalidSongs]): added unit test for the
	deleteInvalidSongs method.
	([TestPlaylist -testDeleteSongsInArray]): added unit test for the
	deleteSongsInArray: method.
	([TestPlaylist -testSongAtIndex]): added unit test for the
	songAtIndex: method.

2005-02-14  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Tests/Cynthiune_app/MockSong.[hm]: new module containing a
	subclass of Song, designed to give access to ivars.

	* Tests/Cynthiune_app/MockPlaylist.[hm]: new module containing a
	subclass of Playlistm designed to give access to ivars.

	* Playlist.m ([Playlist -deleteAllSongs]): new method to remove
	all the songs from the array.
	([Playlist -songAfter:song]): new method returning the song
	after the one passed as parameter.
	([Playlist -songBefore:song]): new method returning the song
	before the one passed as parameter.
	([Playlist -numberOfSongs]): returns the number of songs in the
	playlist.
	([Playlist -duration]): return an NSNumber with the total duration
	of the playlist in seconds.

	* Tests/Cynthiune_app/TestPlaylist.m ([TestPlaylist -setUp]):
	initialize 3 mock songs that can be used during the tests.
	([TestPlaylist -testDeleteAllSongs]): added unit test for the
	deleteAllSongs method.
	([TestPlaylist -testSongBefore]): added unit test for the
	songBefore: method.
	([TestPlaylist -testSongAfter]): added unit test for the
	songAfter: method.
	([TestPlaylist -testnumberOfSongs]): added unit test for the
	numberOfSongs method.
	([TestPlaylist -testduration]): added unit test for the duration
	method.

	* Playlist.m ([Playlist -firstSong]): new firstSong method.
	([Playlist -lastSong]): new lastSong method.

	* Tests/Cynthiune_app/TestPlaylist.m ([TestPlaylist
	-testFirstSong]): added unit test for the firstSong method.
	([TestPlaylist -testLastSong]): added unit test for the lastSong
	method.

	* Playlist.m ([Playlist -addSong:song]): new addSong: method.
	([Playlist -deleteSong:song]): new deleteSong: method.

	* Tests/Cynthiune_app/TestPlaylist.m ([TestPlaylist
	-testAddSong]): new unit test for the addSong method.
	([TestPlaylist -testDeleteSong]): new unit test for the deleteSong
	method.

	* Tests/Cynthiune_app/TestPlaylist.[hm]: new unit testsuite for
	the Playlist object.

	* Tests/Cynthiune_app: new unit testsuite for the Cynthiune
	application files.

2005-02-12  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Tests/Cynthiune_framework/Testutils.m ([Testutils -init]): 
	new init method, initializing the elements of the test that have
	only to be initialized once during the run of the testsuite.
	([Testutils -dealloc]): new dealloc methods cleaning up the
	elements initialized in init.
	([Testutils -testlogRect]): added unit test for the logRect
	function.
	([Testutils -testinvertBytesInBuffer]): improved the test by
	checking the error messages output by NSLog during a wrong
	invocation of invertBytesInBuffer.
	([Testutils -testconvert8to16]): added unit test for the
	convert8to16 function.
	([Testutils -testmakeTitleFromFilename]): added unit test for the
	makeTitleFromFilename function.

2005-02-11  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* CynthiuneController.h: the appWindow ivar was renamed to
	playerWindow.

	* CynthiuneController.m (initWMWindowTitleSize): new hacking
	function to determine the height of the title bar on X11.
	([CynthiuneController -awakeFromNib]): set WindowsTitleSize and
	WindowsBorderSize here, depending on the value returned by
	GSHandlesWindowDecorations(). All of the above happens only on
	GNUstep.

	* SongInspectorController.m ([-awakeFromNib]): the level of the
	inspectorPanel is now set to "NSFloatingWindowLevel" instead of
	"NSModalPanelWindowLevel", since it looks more appropriate;

	* Frameworks/Cynthiune/utils.m (reverseComparisonResult): return
	NSOrderedSame if result == NSOrderedSame;

	* Tests/Cynthiune_framework/Testutils.m ([Testutils
	-testfileIsAReadableDirectory]): added unit test for the
	fileIsAReadableDirectory function.
	([Testutils -testinvertBytesInBuffer]): added unit test for the
	invertBytesInBuffer function.
	([Testutils -testreverseComparisonResult]): added unit test for
	the reverseComparisonResult function.

2005-02-10  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* CynthiuneSongTitleCell.m: made subclass of CynthiuneTextCell.
	([CynthiuneSongTitleCell -setPointerImage:pointerImage]): new
	accessor method to specify the pointer image.
	([CynthiuneSongTitleCell -copyWithZone:theZone]): made conform to
	the NSCopying protocol.

	* Tests/Cynthiune_framework/Testutils.m: initial unit test module
	for the utils.m in the Cynthiune framework.

	* Frameworks/Cynthiune/NSArrayExtensions.[hm]: new module
	containing extension methods to the NSArray and NSMutableArray
	classes.

	* Frameworks/Cynthiune/utils.m (makeTitleFromFilename): new
	function to the determine the title of a song from its filename.

	* Bundles/Timidity/Timidity.m: new Timidity format bundle that
	accepts midi files and reads them through a piped timidity
	process.

	* CynthiuneTextCell.[hm]: new subclass of NSTextFieldCell that
	accepts a specific highlight color parameter.

	* PlaylistController.m ([PlaylistController -_updateStatusLabel]):
	new method that displays the amount of songs in the playlist, the
	total time of the playlist and the time of the selection if songs
	are selected.
	([PlaylistController -_addSongsFromArray:songArraywithDir:aDirectory]) 
	([PlaylistController -removeSelectedSongs:sender]) 
	([PlaylistController -removeAllSongs:sender]) 
	([PlaylistController -cleanupPlaylist:sender]) 
	([PlaylistController -openSongFromNSApp:aSong]) 
	([PlaylistController -tableSelectionIsChanging:aNotification]): 
	invoke [self _updateStatusLabel] whenever something has changed in
	the playlist.
	([-_resetTimeDisplay:aTimer], [-_updateDisplayResetTimer]) 
	([-_updateSelectionTimeDisplay]): removed the methods which were
	part of the previous mechanism to display the time of the
	selection in the timerField.

	* PlaylistController.h: the "Player" protocol no longer exists.
	Removed references to it. Added a new "playlistStatusLabel" ivar.

2005-01-12  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* CynthiunePauseButton.m ([-sendAction:action:object]): removed
	overriden method since the animation has to be started when the
	button state changes.

	* PlaylistController.h: removed the pauseAnimationTimer and
	animationStatus ivars.

	* PlaylistController.m ([-_animatePauseButton]) 
	([-_startPauseAnimation], [-_stopPauseAnimation]): removed methods
	since they were moved into the new CynthiunePauseButton class.
	([PlaylistController -playerPlaying:aNotification]): no longer
	invoke "setImage:" on pauseButton.
	([-playerPaused:aNotification]): no longer invoke
	_startPauseAnimation and set the state of pauseButton to YES.
	([PlaylistController -playerResumed:aNotification]): no longer
	invoke _stopPauseAnimation and set the state of pauseButton to NO.
	([PlaylistController -playerStopped:aNotification]): no longer
	invoke "setImage:" on pauseButton.

	* CynthiunePauseButton.[hm]: new subclass of NSButton that is
	acting like a toggle button but alternates between its image and
	alternateImage with a timer when activated. This gives a blinking
	effect to the active button.

	* CynthiuneSongTitleCell.[hm]: new class replacing
	CynthiuneSongPointerCell and with a different meaning in that it
	is a subclass of NSTextField. Large portions of this code taken or
	inspired from GNUMail by Ludovic Marcotte <ludovic@sophos.ca>.

	* TableViewController.m ([TableViewController -init]): allocate
	and initialize the 4 NSColor * ivars.
	([TableViewController -dealloc]): release them here.
	([TableViewController -_addNeededColumns]): removed the previous
	CynthiuneSongPointerCell and replace the cell used for the song
	title with an instance of the new CynthiuneSongTitleCell class.
	([TableViewController -_addNeededColumns]): changed the "playlist"
	and "duration" identifiers to "song" and "time" for consistency.
	([TableViewController -awakeFromNib]): set the cell spacing to
	0.0.
	([-_postTableDoubleClickNotification]) 
	([-_postTableSelectionDidChangeNotification]) 
	([-_postTableSelectionIsChangingNotification]): removed those
	methods so avoid a useless method call.
	([TableViewController
	-tableView:tableViewmouseDownInHeaderOfTableColumn:tableColumn]):
	use the column identifiers rather than their number to identify
	them.
	([TableViewController
	-tableView:tableViewwillDisplayCell:cellforTableColumn:tableColumnrow:rowIndex]):
	take the class change into account with regard to the "song"
	column and choose an appropriate background color depending on the
	row number and its selection status.

	* TableViewController.h: added 4 new NSColor * ivars that will be
	used to draw the background color of the data cells:
	evenRowsBgColor, oddRowsBgColor, evenSelectedRowsBgColor,
	oddSelectedRowsBgColor.

2005-01-11  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* SongInspectorController.m ([SongInspectorController -init]):
	load the SongInspector nib from here.

	* PreferencesController.m ([PreferencesController
	-setBundleView:bundlePrefsView]): tells bundleViewBox to refresh
	itself.

	* PlaylistController.m ([PlaylistController -_startTimeTimer]):
	release the timer after it's invalidated.
	([PlaylistController -_startPauseAnimation]): new method that
	creates an animation timer and sets it to call _animatePauseButton.
	([PlaylistController -_stopPauseAnimation]): new method that
	invalidates and releases the animation timer for the pause button.
	([PlaylistController -_animatePauseButton]): new method to animate
	the pause button by changing its image alternatively.
	([PlaylistController -playerPlaying:aNotification]): no longer
	calls setActiveSong on tableViewController but tells it to show
	the song pointer.
	([PlaylistController -playerStopped:aNotification]): tells
	tableViewController to hide the song pointer.

	* PlaylistController.h: new pauseAnimationTimer and
	animationStatus ivars.

	* PlaylistController.m ([PlaylistController -awakeFromNib]): no
	longer load the SongInspector nib from here.

	* TableViewController.m ([-setActiveSong:song]): removed method.
	([-songIsActive:aSong]): removed method.
	([TableViewController -setShowSongPointer:show]): new setter
	method for the new displaySongPointer ivar.
	([TableViewController -_addNeededColumns]): prepend a new column
	identified as "pointer", having a CynthiuneSongPointerCell as its
	data cell.
	([TableViewController
	-tableView:aTableViewwillDisplayCell:cellforTableColumn:aTableColumnrow:rowIndex]): new delegate method that tells the pointer cell in the pointer column to display the image if the row parameter is equal to the number of the song being played and if the player is active.

	* TableViewController.h: new displaySongPointer BOOL ivar.

	* TableViewController.m ([TableViewController
	-setShowSongPointer:show]): setter for the new songPointer ivar.

	* TableViewController.h: added songPointer BOOL ivar.

	* CynthiuneInfo.plist: added file types handled by the WindowMedia
	and the Musepack format bundles.

	* CynthiuneController.m (GSHandlesWindowDecorations): new function
	which indicates, under GNUstep, whether GNUstep or the window
	manager handles the window decoration. This is needed to determine
	the correct position of the windows.
	([CynthiuneController -init]): initialize WindowsTitleSize and
	WindowsBorderSize depending on the value returned by
	GSHandlesWindowDecorations. The values are valid for WindowMaker.
	([CynthiuneController
	-_computeDeltaYOfFrame:mainFramewithFrame:aFrame]): compute the
	values by taking the WindowsTitleSize and WindowsBorderSize into
	account.
	([CynthiuneController -windowWillClose:aNotification]) 
	([CynthiuneController -_initWindowsPosition]): the windows
	identifiers are changed to "PlayerWindow" and "PlaylistWindow" in
	the preferences.

	* Frameworks/Cynthiune/utils.m (logRect): print a label associated
	with the corresponding value.

	* Player.m ([Player -stop]): send a PlayerResumedNotification when
	paused to tell the observer we are no longer paused.

	* CynthiuneSongPointerCell.[mh]: new NSCell subclass to indicate
	the song being played.

2005-01-04  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlaylistController.m ([-toggleSongInspector:sender]): new method
	replacing [-showSongInspector:].
	([PlaylistController -songInspectorWasShown:aNotification]): set
	state of songInspectorMenuItem to off.

	* SongInspectorController.m ([SongInspectorController
	-setDelegate:anObject]): added SongInspectorWasShownNotification
	and replaced SongInspectorWasClosedNotification with
	SongInspectorWasHiddenNotification.
	([SongInspectorController -toggleDisplay]): new method replacing
	hide and show.
	([SongInspectorController -_updateFields]): update filenameField
	with the full filename of the song being inspected.

	* SongInspectorController.h: added filenameField ivar.

	* Song.m ([Song -year]): new stub method that shall return the
	year of the song in the future.

	* SongInspectorController.m ([SongInspectorController
	-awakeFromNib]): set self as delegate for inspectorPanel.
	([SongInspectorController -setDelegate:anObject]): new method.
	([SongInspectorController -delegate]): new method.
	([SongInspectorController -setSong:newSong]): update the song ivar
	and the inspector fields only if newSong != song.
	([SongInspectorController -show]): new method to show the
	inspector panel.
	([SongInspectorController -hide]): new method to hide the
	inspector panel.
	([SongInspectorController -windowWillClose:aNotif]): delegate
	method that sends a notification to our delegate when the panel is
	closing.

	* PlaylistController.h: added songInspectorMenuItem ivar.

	* PlaylistController.m ([PlaylistController -init]): set self as
	delegate for songInspectorController.
	([PlaylistController -awakeFromNib]): set state of
	songInspectorMenuItem to off.
	([PlaylistController -showSongInspector:sender]): new action
	method requesting the songInspectorController to show the
	inspector window and where the state of songInspectorMenuItem is
	set to on.
	([PlaylistController -songInspectorWasClosed:aNotification]): new
	delegate method received when the song inspector is closing, where
	we set the state of songInspectorMenuItem back to off.

	* SongInspectorController.[h,m]: new class implementing the
	controller API for the new Song inspector. It currently take cares
	of updating the different fields but:
	- it only supports one song at a time;
	- it can't save modifications yet.

	* Frameworks/Cynthiune/utils.m (findStringStart, findStringEnd) 
	(trimmedString): removed functions since the NSString API has the
	stringByTrimmingSpaces method.

	* Frameworks/Cynthiune/Output.h: removed the outputBytes method
	from the Output protocol.

	* Bundles/Esound/OSS.h: removed the bytes ivar.

	* Bundles/Esound/OSS.m ([-outputBytes]): removed method since
	it's no longer required in the Output protocol.

	* Bundles/Esound/Esound.h: removed the bytes ivar.

	* Bundles/Esound/Esound.m ([-outputBytes]): removed method since
	it's no longer required in the Output protocol.

2005-01-01  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/OutputSkeleton/: new bundle directory containing the
	skeleton for an output bundle.

2004-12-31  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Song.m ([Song -compareByPlaylistRepresentation:aSong]): invokes
	numericallyCompare: on the trackNumber NSString rather than
	calling compareStringsNumerically().

	* Frameworks/Cynthiune/NSStringExtensions.m ([NSString
	-numericallyCompare:aString]): new category method replacing
	compareStringsNumerically() in utils.m.
	([NSString]): new class module containing extensions to NSString.

	* Frameworks/Cynthiune/utils.m (findStringEnd): end may not be
	less than the beginning of the string.
	(trimmedString): end being < start means the trimmed string will
	be of length 0. This solves a bug that was causing the new
	allocation to fail because of an excessive request of memory and
	hence a segfault during strncpy.
	(compareStringsNumerically): removed function.

2004-12-30  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlaylistController.m ([PlaylistController
	-playerPlaying:aNotification]): invokes setActiveSong: instead of
	selectRow: on tableViewController. This initiates our change
	in the way we mark the song that is currently playing.

	* TableViewController.m ([TableViewController
	-setActiveSong:song]): new method replacing selectRow:, instead of
	an integer, it takes a Song argument. This name change refocusses
	on the correct purpose of this method, which is to mark the
	current song as being played in the playlist view.
	([TableViewController -songIsActive:aSong]): new name for
	songIsSelected:. Renamed for the reason mentionned above.
	([TableViewController -updateView]): invokes setActiveSong: instead
	of selectRow:.

	* Playlist.m ([Playlist -selectSong:aSong]): new method similar to
	selectSongNumber but with a Song parameter.
	([Playlist -currentSong]): revived method.

	* Bundles/Mod/Mod.m ([Mod +initialize]): added
	MODPLUG_ENABLE_OVERSAMPLING to the modplug flags.

2004-12-28  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/MP3/MP3.m (returnTag): new macro that invokes the
	relevant taglib function.

	* utils.m (trimmedString): new utility function that returns a new
	string equal to the one passed as parameter but where we make sure
	any starting and ending spaces are removed.

	* Player.m ([Player -play]): invoke _playLoopIteration after
	sending the PlayerPlayingNotification so that we make sure the
	player is in a consistent state whenever something bad happens and
	triggers another notification.

2004-12-15  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/WindowsMedia/WindowsMedia.m ([WindowsMedia
	+canTestFileHeaders]): we now declare that we are able to test our
	file headers and content correctly.
	([WindowsMedia +streamTestOpen:fileName]): invoke the functions in
	our avifile bindings to test the validity of the file passed as
	parameter.

	* Bundles/WindowsMedia/CWMFile.cpp (_testASFHeaders): new function
	to test if a file has a Microsoft ASF header.
	(WMFileOpen): now invoke _testASFHeaders and test its result
	before opening the file.
	(WMFileClose): now invoke delete on the passed WMFile parameter.
	(WMFileAudioStreamCount): new wrapper function around
	IReadFile::AudioStreamCount().

2004-12-14  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/Musepack/Musepack.m (ShiftSigned): made inline.
	(CopyBuffer): idem.
	([-readNextChunk:bufferwithSize:bufferSize]): copied code from the
	WindowsMedia format bundle to make sure the output buffer will
	never be overflood, through the use of an internal intermediary
	buffer.

	* Bundles/MP3/MP3.h: removed "opened" ivar.

	* Bundles/MP3/MP3.m ([MP -_resetIVars]): initialize all ivars here
	so that the same code is shared in init and streamClose.
	General: replaced dependency on libid3tag with one on taglib,
	which is much better and simpler.

	* Player.m ([Player -chunkFinishedPlaying]): invoke
	_playLoopIteration only when all requests are completed.

	* Bundles/Musepack/*.cpp: C++ binding code for the libmusepack
	library.

	* Bundles/Musepack/Musepack.[mh]: new format class
	bringing the ability for Cynthiune to read Musepack (MPC) files.

2004-12-13  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/WindowsMedia/CWMFile.[h,cpp]: new binding modules
	provided to glue the C++ AviFile API and the WindowsMedia ObjC
	code.

	* Bundles/WindowsMedia/WindowsMedia.[h,m]: new format class
	bringing the ability for Cynthiune to read ASF and WMA files.

2004-12-12  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/FormatSkeleton/: new bundle directory containing the
	skeleton for a format bundle.

2004-12-11  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Player.m ([Player -_playLoopIteration]): increment requests when
	a chunk is sent to the output bundle.
	([Player -_playLoopIteration]): post a songended notification only
	when the amound of requests is 0.
	([Player -chunkFinishedPlaying]): decrement the amount of
	requests.

	* Player.h: added a new "requests" ivar.

	* Bundles/Esound/Esound.h: removed unused "currentChunk" ivar.

	* Bundles/MP3/MP3.m (seekOffset): returns -1 if the end of file is
	found before any non-zero character could be found.
	([MP +streamTestOpen:fileName]): returns NO if the result of
	seekOffset is -1.

2004-11-29  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlaylistTableView.m ([PlaylistTableView
	-draggingSourceOperationMaskForLocal:isLocal]): new overriden
	method to permit DnD activity between Cynthiune and other
	applications.

2004-11-19  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* GNUmakefile: release 0.9.4.

	* Song.m ([Song -_fileWasModified]): set status to
	SongFileNotFound if attributes is nil.

	* MailService.m ([MailService -composeBugReport]): instead of
	using the DO mechanism of OpenStep, use the NSURL API and the
	"mailto:" protocol.

2004-11-17  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlaylistController.m ([PlaylistController -pausePlayer:sender]) 
	([PlaylistController -previousSong:sender], currentSongNumber) 
	([PlaylistController -changeTimeDisplay:sender]): player is always
	instantiated now and no longer can be "nil".

	* MailService.m ([MailService +instance]): mailService declared as
	static. Don't recreate if already exists.

	* MailService.[hm]: new class to deal with the local OS's mail
	application in order to compose a bug report about Cynthiune. 

	* PlaylistController.m ([PlaylistController -init]): set self as a
	delegate of the playlist.
	([PlaylistController -toggleMute:sender]): the state change is
	reflected on both the Player/Mode/Mute menu item as well as the
	mute toggle button.
	([PlaylistController -toggleShuffle:sender]): the state change is
	reflected on both the Player/Mode/Shuffle menu item as well as the
	shuffle toggle button.
	([PlaylistController -toggleRepeat:sender]): the state change is
	reflected on both the Player/Mode/Repeat menu item as well as the
	repeat toggle button.
	([PlaylistController -addSongs:sender],
	[PlaylistController -addSongsFolders:sender]): new action methods,
	triggered by the application menu.
	([PlaylistController -addSong:sender]): modified to call the
	above action methods.
	([PlaylistController -removeSelectedSongs:sender],
	[PlaylistController -removeAllSongs:sender],
	[PlaylistController -cleanupPlaylist:sender]): new action methods,
	triggered by the application menu.
	([PlaylistController -removeSong:sender]): modified to call the
	above action methods.
	([PlaylistController -saveList:sender]) 
	([PlaylistController -saveListAs:sender]): new action methods,
	triggered by the application menu.
	([PlaylistController -saveListFromPopupMenu:sender]): new method
	derived of the old "saveList" method, modified to call the
	above action methods.
	([PlaylistController -playlistChanged:aNotification]): new
	delegate method that saves the playlist states and update the
	Player.

	* Playlist.m: added a new notification:
	"PlaylistChangedNotification".
	([Playlist -setDelegate:anObject], [Playlist -delegate]): new
	methods.

2004-11-16  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlayerPreference.[hm]: new "PlayerPreference" class, designed to
	handle preferences for the Player.

	* PlayerController.[hm]: new "PlayerController" class, designed to
	hold the controlling code specific to the Player initially put in
	PlaylistController.

	* CynthiuneController.m (localizeMenu): new static function
	implementing a new mechanism for translation menu labels. Instead
	of replacing them with static entries, they are scanned and
	replaced with their translation. This makes the code lighter and
	removes the constraint of keeping up with the different where to
	change the localized strings whenever it happens.
	([-_initMenuLabels]),
	([-_setStrings:stringsforSubmenu:menuwithOffset:offset]),
	([-_setStrings:stringsforSubmenu:menu]),
	([-_setStrings:stringsforMenu:menu]: removed methods.

2004-11-15  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* TableViewController.m ([TableViewController
	-tableView:tvwriteRows:rowstoPasteboard:pboard]): removed #ifdef
	and only declare elements of type CynthiunePlaylistDragType to the
	pasteboard. The rest will be provided through
	pasteboard:ProvideDataForType:.
	([TableViewController -pasteboard:pboardprovideDataForType:type]):
	implemented this delegate method from the NSPasteBoard API to
	provide elements of type NSFilenamesPboardType when requested.
	([TableViewController -tableView:tvvalidateDrop:infoproposedRow:rowproposedDropOperation:dropOperation]):
	check the dragging source before requesting elements of a specific
	type to the pasteboard. This way, we make sure we control the right
	type of letting the underneath API to decide for us. This is the
	right way to do things and solves a couple of problems with our
	previous implementation.

2004-11-05  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/OSS/OSSPreference.m ([OSSPreference
	-_initDefaults]): use a BOOL "defaultsInitted" to check whether
	this method was executed.
	([OSSPreference -_init]): the defaultsInited ivar was removed.
	([OSSPreference -awakeFromNib]), ([OSSPreference -dspDevice]):
	call _initDefaults.

	* Bundles/Esound/EsoundPreference.m ([EsoundPreference
	-_initDefaults]): use a BOOL "defaultsInitted" to check whether
	this method was executed.
	([EsoundPreference -_init]): the defaultsInited ivar was removed.
	([EsoundPreference -awakeFromNib]), ([EsoundPreference
	-socketIsTCP]), ([EsoundPreference -tcpHostConnectString]): call
	_initDefaults.

	* Player.m ([Player -_ensureOutput]): when the output bundle has
	changed, we need to set rate an channels to 0 and call
	_reInitOutputIfNeeded so that we make sure the new output is
	initialized correctly.

2004-10-01  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Song.m ([Song -status]): call _readInfos, so that whenever this
	method is called, we make sure file operations occur that
	initialize the status correctly.

	* GeneralPreference.m ([GeneralPreference -init]): call
	_initDefaults to initialize the managed values with correct
	defaults so that they are accessible all the time.

2004-09-27  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlaylistController.m ([PlaylistController
	-_initPlaylistPopups]): new "Cleanup" entry in the "Remove" menu.
	([PlaylistController -removeSong:sender]): if the selected menu is
	"Cleanup", send "removeBadEntries" to the playlist.

	* Playlist.m ([Playlist -removeArrayOfSongs:anArray]): cast
	[_regularList count] to signed int so that currentSongNumber can
	be -1 and let the condition be computed correctly.
	([Playlist -removeBadEntries]): new method to discover and remove
	songs from which the "status" message does not return SongOK.

2004-09-22  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlaylistController.m ([PlaylistController
	-validRequestorForSendType:returnType:]): don't check the
	returnType.
	([PlaylistController
	-writeSelectionToPasteboard:pboardtypes:types]): don't check that
	tableViewController has any selection since it's done within
	validRequestorForSendType:returnType:.
	([-_extensionIsAcceptable:fileExtension]): removed method (see below).
	([PlaylistController -panel:sendershouldShowFilename:fileName]):
	reduce the use of variables.
	([PlaylistController
	-_oPanelDidEnd:oPanelreturnCode:resultcontextInfo:contextInfo]):
	synchronize the defaults as soon as the key is set.
	([PlaylistController
	-_dirOPanelDidEnd:oPanelreturnCode:resultcontextInfo:contextInfo]):
	synchronize the defaults as soon as the key is set.
	([PlaylistController
	-_startOPanelDidEnd:oPanelreturnCode:resultcontextInfo:contextInfo]):
	synchronize the defaults as soon as the key is set.
	([PlaylistController -_ejectOPanelDidEnd:oPanelreturnCode:resultcontextInfo:contextInfo]): 
	synchronize the defaults as soon as the key is set.

	* FormatTester.m ([FormatTester -extensionIsSupported:extension]):
	new method derived from
	PlaylistController:-[_extensionIsAcceptable:] and designed to
	replace it.

	* CynthiuneController.m ([-_initServices]): removed method.
	([CynthiuneController +initialize]): register
	NSFilenamesPboardType as a service menu sendtype.
	([-validRequestorForSendType:sendTypereturnType:returnType]):
	forward the invocation to playlistController.

	* TableViewController.m ([TableViewController
	-getFirstSelectedRow]): new name for "getSelectedRow". Now returns
	an int instead of an unsigned int so that -1 can be given when no
	song is selected. Check that the playlist actually contain any
	song since -[NSTableView selectedRow] does not void its selection
	when the list is emptied...
	([TableViewController -getFirstSelectedSong]): new name for
	"selectedSong".
	([TableViewController -getSelectedSongs]): new name for
	"getSelection". Ensure that the playlist is populated, otherwise
	returns an empty array.
	([TableViewController -getSelectedSongsAsFilenames]): new name for
	"getSelectionAsFilenames". Ensure that the playlist is populated,
	otherwise returns an empty array.
	([TableViewController -songIsSelected:aSong]): new name for
	"isSongInSelection:".

2004-09-21  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Player.m ([Player -setStream:newStream]): when a new nil stream
	is set post the "PlayerSongEndedNotification" so that the
	PlaylistController knows the song will not be read. This is not
	very clean and needs to be rectified lated.

	* Song.m ([Song -encodeWithCoder:encoder]): call _readInfos to
	make sure we save initialized data.

2004-09-20  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/MP3/MP3.m (decodeInputBuffer): function semantics
	changed to manage only buffer decoding and returning a status code
	about the decoded stream chunk.
	(calcInputRemain): the third argument was a pointer to an int we
	had to modify from inside this function. Now we return that value
	instead.
	([MP -_readStreamMetaData]): completed method to use
	decodeInputBuffer, the same way readNextChunk:withSize: does so
	that we can have a correct file parsing for metadata.

2004-09-16  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/Esound/Esound.m ([Esound
	-prepareDeviceWithChannels:numberOfChannelsandRate:sampleRate]):
	reinitialize the output socket if open. That is the only way to
	modify the stream settings with ESD...

	* TableViewController.m ([TableViewController
	-doubleClick:sender]): take the double-click into account only if
	a real row (> -1) was clicked, otherwise it might just be the
	column header and we don't want the player to start in that case.
	([TableViewController
	-tableView:tableViewmouseDownInHeaderOfTableColumn:tableColumn]):
	take the column number into account instead of its identifier
	since, on OS X, this method is called before the id's are
	available and it generates a warning.
	([TableViewController -awakeFromNib]): disallow column selection,
	hoping the GNUstep team will fix NSTableView one day...

	* Player.m ([Player -_reInitOutputIfNeeded]): if [<output>
	prepareDeviceWithChannels:andRate:] returns 'NO', the new values
	are not retained.

2004-09-15  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* GNUmakefile: release 0.9.3a.

	* Bundles/MacOSX/MacOSXPlayer.m, Bundles/MacOSX/MacOSXPlayer.h:
	converted to the new Output protocol. This version is far cleaner
	than what used to be.

	* Player.m ([Player -stop]): when stopped, awaitingNewStream
	should be set to NO.

2004-09-13  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/OSS/OSS.m ([OSS
	-prepareDeviceWithChannels:numberOfChannelsandRate:sampleRate]):
	directly update the device if open.
	([OSS -closeDevice]): set the "dsp" ivar to nil when released, so
	that we can know whether it is open or not.

	* Player.m ([Player -_ensureOutput]): set rate and channels to 0
	when another Output bundle is instantiated to that we make sure
	its device gets correctly initialized.
	([Player -play]): start the play loop only if calling "openDevice"
	on the output instance returns "YES", otherwise ignore the
	request. Something else should be done, like displaying an error
	message or something like that but we're not there yet.

	* TableViewController.m ([TableViewController
	-tableView:aTableViewobjectValueForTableColumn:aTableColumnrow:rowIndex]): typo.

	* Bundles/OSS/OSS.m: updated to conform the new Output protocol by
	mixing code from the ancien OSS and the new Esound bundle.

2004-09-11  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlaylistController.m ([PlaylistController
	-playerStopped:aNotification]): set currentPlayerSong to nil.

	* Player.m ([Player -chunkFinishedPlaying]): call
	_playLoopIteration if not paused AND if not stopped.

	* PlaylistController.m ([PlaylistController
	-_updatePlayer:force]): send a "setStream" message instead of
	"setSong" to the Player object, by previously calling
	"openStreamForSong" on the relevant Song. Besides, since the
	"song" message is no longer available, we use the new
	"currentPlayerSong" variable to keep track of what is currently
	playing.

	* Song.m ([Song -_refreshSongInfosFromStream:stream]): channels
	and rate are no longer read from the streams.
	([-channels]): removed method.
	([-rate]): removed method.
	([Song -initWithCoder:decoder]): "channels" and "rate" keys are no
	longer decoded from the NSKeyedArchive.

	* Player.m ([Player -_playLoopIteration]): new name for
	"_sendChunkToOutput".
	([Player -play]): simplified a lot since we no longer play "Song"
	objects but objects conforming to the "Format" protocol (streams).
	([Player -setStream:newStream]): simplified a lot the the same
	reason as mentionned above. Besides, restart the play loop if the
	new ivar "awaitingNewStream" is set.
	([Player -_playLoopIteration]): set "awaitingNewStream" to yes
	when the song is finished playing so that setStream can restart
	the loop when a "SongFinishedPlayingNotification" was sent to the
	Player controller.

	* Bundles/Esound/Esound.m
	([-_writeCompleteNotification:aNotification]): no longer emit a
	notification but directly sends the "chunkFinishedPlaying" message
	to the parent player (following the recent change in the "Output"
	protocol).

	* Output.h: "setDelegate:" and "delegate" removed. Added
	"setParentPlayer:" instead. Also, modified the OutputDelegate
	informal protocol to remove the NSNotification argument to the
	"chunkFinishedPlaying" method.

	* Bundles/XMMSInput/XMMSInput.m ([XMMSInput -readDuration]):
	return an unsigned int instead of a NSNumber.

	* Player.m ([Player -_ensureOutput]): separate the conditions in
	two level-1 blocks. Drop output if it's class is different than
	the one selected in the preferences and set it to nil. Afterward,
	output is tested against nil and generated if needed. Besides, the
	output bundle is initialized with the rate and channels if needed.
	([Player -setSong:aSong]): send the
	"prepareDeviceWithChannels:andRate:" message only if output is
	non-nil and the current song's channels and rate values are not
	those accounted for output.

2004-09-10  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Player.m ([Player -setSong:aSong]): simplified a lot by removing
	the code used when playing the song since it's the role of the
	output bundles to determine whether the device has to be reopened
	or not.
	([Player -play]): the "prepareDeviceWithChannels:andRate:" message
	is called from the "setSong:" method so we don't need to call it
	from here anymore.
	([Player -_ensureOutput]): 

	* PlaylistController.m ([PlaylistController -_setPlayerSong:]):
	removed method.
	([PlaylistController -_updatePlayer:force]): instead of calling
	"_setPlayerSong", set the Song directly. If the player is paused,
	"unpause" it. Reinit the progress slider through the new
	"_initProgressSliderFromSong:" method.
	([PlaylistController -_initProgressSliderFromSong:aSong]): new
	method to initialize the ProgressSlider depending on the Song
	length and "seekability".

	* FormatTester.m ([FormatTester +formatTester]),
	GeneralPreference.m ([GeneralPreference +instance]),
	PreferencesController.m ([PreferencesController
	+preferencesController]): initialize the singleton with the "new"
	message instead of "alloc" and "init".

2004-09-09  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Output.h: new interface describing the Output protocol, which
	must now be implemented by the Output bundles in place of the old
	Player protocol.

	* Bundles/Esound/Esound.m, Bundles/Esound/Esound.h: made conform
	the the "Output" protocol, described in Output.h.

	* Player.h: the "isRunning" method was renamed to "playing".

	* PlaylistController.m ([PlaylistController -init]): player is now
	instantiated here, since it is no longer a variable object.
	([-_initializePlayer]): this method was removed.

	* Player.m, Player.h: Player is now a real object with a
	centralized handling of the streams and the output of their
	content through the output bundles. This refactoring cleans up the
	code and reduces the amount of code needed to write an output
	bundle, which now must conform to the "Output" protocol, instead
	of "Player".

	* Format.h: the argument to seek: is called "seconds" now.

	* Playlist.m ([Playlist -saveToDefaults]): use NSKeyedArchiver to
	save the playlist.
	([Playlist -loadFromDefaults]): use NSKeyedUnarchiver to load the
	default playlist. This way their metadata no longer need to be
	read through the song format bundles. This speeds up the loading of
	Cynthiune for large playlists. 

	* Song.m ([Song -encodeWithCoder:encoder]) 
	([Song -initWithCoder:decoder]): implementation of the NSCoding
	protocol for archiving song data.

2004-08-31  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* GeneralPreference.m ([GeneralPreference -_initDefaults]): the
	playlistFormat variable was querying the OutputBundle preference
	value instead of PlaylistFormat.
	([GeneralPreference -preferredOutputClass]): new name for
	preferredPlayerClass.

2004-08-19  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Song.m ([Song -_refreshSongInfosFromStream:stream]): the Format
	protocol was changed back. readDuration returns an unsigned int
	again instead of an NSNumber, so we convert the unsigned int
	explicitly here now.

2004-08-16  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/XMMSInput/XMMSInput.m: first attempt at providing an
	XMMS plugin wrapper bundle.

2004-08-14  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/FLAC/FLAC.m (writeCallback): moved code of
	_refillBufferWithData:withSize: here to avoid a useless method
	call.

	* Song.m ([Song -_fileWasModified]): test whether a file was
	modified between two invocations of this method, by checking its
	date and filesize.
	([Song -_readInfos]): use the private method _fileWasModified
	instead of _infosRead to detect whether to update a Song's
	metainfos.
	([Song -init]): initialize status ivar to SongFileNotFound.
	([Song -status]): new accessor.
	([Song -_refreshSongInfosFromStream:stream]): new method called
	when everything else is fine within _readInfos.
	([-_readInfos]): only refreshed the Song's status. No error
	message is passed here.
	([-setFilename:aFilename]): don't test the Song format here.
	([Song -playlistRepresentation]): compose a correct playlist
	representation title, depending on the status.

2004-08-12  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/FLAC/FLAC.m: new output bundle for decoding Free
	Lossless Audio Codec encoded sound files.

2004-07-27  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* CynthiuneController.[mh]: MainController class renamed to
	CynthiuneController.

	* CynthiunePopUpButton.m ([CynthiunePopUpButton
	-addItemWithTitle:aTitle]): removed _updateEnabled method to avoid
	useless code and a useless method call.

	* Bundles/Esound/Esound.h: BUF_SIZE set to 176400.

	* Bundles/OSS/OSS.h: BUF_SIZE set to 176400 (1 second @ 44kHz/16
	b/stereo).

	* PlaylistFile.m ([PlaylistFile _M3UContentWithArray:]): the
	format string should contain "%@" instead of "%d" for the song
	durations since they are now NSNumber's.

2004-07-14  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Song.m ([Song -playlistRepresentation]): removed useless
	"format" variable.

2004-07-13  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Song.m ([Song -duration]): invoke _readInfos before returning
	the value.
	([Song -openStreamForSong]): make stream autoreleased only if
	it opens correctly, otherwise release it directly.

	* Bundles/Ogg/Ogg.m ([Ogg +streamTestOpen:fileName]): don't report
	when the returned NSFileHandle is nil since it could happen with
	any missing file.

	* utils.m (strndup): made non-static (for MacOS X only).

	* Player.m ([-initWithSong:aSong]): removed useless method.
	([+playerWithSong:aSong]): removed useless method.

2004-07-07  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* utils.m (compareStringsNumerically): new function to compare
	numerical strings waiting for the GNUstep implementation of the
	NSNumericSearch option in NSString.

	* TableViewController.m ([TableViewController +initialize]): nc is
	now a static global variable instead of an ivar. It is initialized
	here.

	* Song.m ([Song -compareByPlaylistRepresentation:aSong]):
	trackNumber is an NSString, so we cannot really use compare: on
	it. Instead we use our new utils function
	"compareStringsNumerically".
	([Song -reverseCompareByDuration:aSong]): directly calls the
	target method instead of passing through our ascending comparison
	method.

	* PlaylistController.m ([-stopPlayer:sender]): the player ivar is
	released in the playerStopped: notification method, which is
	invoked after "stop" was sent to the player, so there is no
	need to do it here.
	([PlaylistController -playerSongEnded:aNotification]): same thing
	here.

	* Player.m ([Player +playerWithSong:aSong]): the "song" variable
	really should be named "player"...

	* Bundles/Esound/EsoundPreference.m: class EsoundPreference split
	from Esound.m.

2004-07-06  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* TableViewController.m ([TableViewController
	-tableView:aTableViewobjectValueForTableColumn:aTableColumnrow:rowIndex]):
	we call the NSNumber method timeStringValue on duration instead of
	the old utility timeStringFromSeconds().

	* Playlistcontroller.m ([PlaylistController
	-_updateSelectionTimeDisplay]), ([PlaylistController
	-playerPlaying:aNotification]): duration is now an NSNumber *,
	code modified accordingly.

	* Song.m ([Song -init]): the duration ivar is now a NSNumber.
	([Song -compareByPlaylistRepresentation:aSong]): the tracknumber
	are compared directly using the compare: method provided by the
	NSNumber class.
	([Song -reverseCompareByPlaylistRepresentation:aSong]) 
	([-reverseCompareByDuration:aSong]): we now use the new
	reverseComparisonResult() function from utils.h instead of
	providing our code.

	* InfoDisplayController.m ([-hideTextFields], [-hideTextFields]):
	code from this methods removed and directly included within the
	hide and show methods.
	([InfoDisplayController -_setTimerFromUnsignedInt:timer]): new
	private method to update the timer field with the integer passed
	as parameter.

	* CynthiuneFileHandle.m: new child class of NSFileHandle for
	handling asynchronous I/O on file descriptors.

	* NSNumberExtensions.m: new module containing extension method to
	the NSNumber class.
	([NSNumber -timeStringValue]): new implementation of old utils.m's
	timeStringFromSeconds. Removed test on (seconds != 0) since the
	result will be valid anyway.

	* utils.m (timeStringFromSeconds): moved to new
	NSNumberExtensions.m module.
	(reverseComparisonResult): new function for sorting methods.

	* Bundles/AudioFile/AudioFile.m ([AudioFile -readDuration]):
	returns an NSNumber * as expected by the modified Format protocol.

	* Bundles/Ogg/Ogg.m ([Ogg -readDuration]): returns an NSNumber *
	as expected by the modified Format protocol.

	* Bundles/Mod/Mod.m ([-readDuration]): returns an NSNumber * as
	expected by the modified Format protocol.

	* Bundles/MP3/MP3.m (seekOffset, testRiffHeader, testMP3Header) 
	(calcInputRemain): changed methods with those names to static
	inline functions. iRemain passed as pointer so that we can modify
	it directly.
	(fillPCMBuffer): removed intermediary variables to make code
	shorter.
	([-readDuration]): returns an NSNumber * as expected by the
	modified Format protocol.

	* Format.h: readDuration now returns an NSNumber *.

2004-07-04  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/MP3/MP3.m (_decodeInputBuffer): new function split from
	readNextChunk:withSize: to make code cleaner and shorter. Its
	exact purpose is to decode the data fed to it as parameter and
	return an the size of the decoded data or an appropriate return
	code if needed.

2004-06-29  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/MP3/MP3.m (_translateBufferToPCM, _fillPCMBuffer) 
	(_audioLinearDither): new static functions that replace the
	methods with the same name, this makes the bundle use a bit less
	of CPU time since no message resolution is done.

	* Song.m ([Song -filename]): original purpose put in new method
	"shortFilename", now replaces "fullFilename".

2004-06-28  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Playlist.m ([Playlist
	-sortByPlaylistRepresentation:descending]): changed the signature
	of this method to accept a BOOL parameter indicating whether we
	want the resulting order to be descending or not. It selects the
	appropriate comparison method selector accordingly.
	([Playlist -sortByDuration:descending]): same thing here.

	* Song.m ([Song -reverseCompareByPlaylistRepresentation:aSong]):
	new method that calls compareByPlaylistRepresentation: and reverse
	the result.
	([Song -reverseCompareByDuration:aSong]): same thing here for
	compareByDuration:.

	* TableViewController.m ([TableViewController -init]): added two
	ivars, sortedInPlaylist and sortedInDuration so that we know when
	to sort the playlist in ascending or descending order.
	([TableViewController
	-tableView:tableViewmouseDownInHeaderOfTableColumn:tableColumn]):
	take sortedInPlaylist and sortedInDuration into account when
	sorting. One should be reversed and the other should be set to NO.
	([TableViewController -_acceptDroppedFiles:aFilesListatRow:row]):
	set both to NO when a song file was dropped.
	([TableViewController -_acceptDroppedRows:aRowsListatRow:row]): 
	set both to NO when a song was dragged from within the list and
	dropped.

	* Bundles/OSS/OSSPreference.m: class OSSPreference split from
	OSS.m.

2004-06-22  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/OSS/OSS.m: entirely rewritten (except for
	OSSPreferences) to use the asynchronous interface of NSFileHandle
	instead of threads.

	* PlaylistController.m ([PlaylistController -_startTimeTimer]):
	the timer should run in the NSEventTrackingRunLoop too.

	* Player.h: renamed "startPlayLoop" and "StopPlayLoop" to "play"
	and "stop" respectively. Made the Player protocol slightly lighter
	by removing the initWithSong: and audioInit: method prototypes.

	* Player.m ([Player +load]): initialize the global variable nc
	here.
	([Player -initWithSong:aSong]): new initializer.
	([Player +playerWithSong:aSong]): new constructor based on the
	above.

	* Bundles/MP3/MP3.m ([MP
	-readNextChunk:bufferwithSize:bufferSize]): returns -1 when an
	error occurs.

	* CynthiuneWindow.m: new subclass of NSWindow designed to let the
	user whether he wants textured windows or not on MacOS X.

	* FormatTester.m ([FormatTester -formatClassForFile:file]):
	Class values can't be "nil" but "NULL".
	([FormatTester -formatClassAtIndex:formatNumber]): same thing.

	* GeneralPreference.m ([GeneralPreference -windowsAreTextured]):
	new method to test whether windows should be displayed as regular
	or textured windows.
	([GeneralPreference -_initDefaults]): initialized the new toggle
	related to the textured windows.
	([GeneralPreference -texturedWindowsChanged:sender]): new callback
	method.

2004-06-18  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* GeneralPreference.m ([GeneralPreference
	-_noDefaultOutputModuleAlert]): new method to display an alert
	panel when no output module is configured.
	([GeneralPreference -preferredPlayerClass]): calls the above when
	playerClass == nil.

	* PreferencesController.m ([PreferencesController
	-loadPreferencesWindowAndSelectMenuEntry:entry]): new method.

	* CynthiunePopUpButton.m ([CynthiunePopUpButton -_updateEnabled]):
	new class derived from NSPopUpButton, that just test whether there
	is more than one item in the menu to enable its popup button.

2004-06-17  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Song.m ([Song -isSeekable]): cache the result in an ivar by
	calling _readInfos.
	([Song -_readInfos]): (new name for -readInfos), test if a stream
	is seekable to avoid multiple openings.
	([Song -setFilename:aFilename]): cache the Format class from here
	to avoid multiple openings and testings, this slightly improves
	the opening of long playlists.

	* Player.m: class PlayerBase renamed to Player.

	* FormatTester.m: -fileType renamed to -formatNumberForFile,
	-classForFile: renamed to formatClassForFile:, and
	-classForFileType: renamed to formatClassAtIndex.
	([FormatTester
	-formatClass:formatClassacceptsFileExtension:extension]): new method.
	([FormatTester -formatClassForFileExtension:extension]): new method.

	* Format.h: added a new protocol method "canTestFileHeaders"
	returning YES if the format bundle has a way of testing the file
	type by checking its headers. Otherwise FormatTester determines
	the right bundle to use by looking at its extension.

	* Bundles/Mod/Mod.m ([Mod +streamTestOpen:fileName]): don't test
	file loading since the only way we can do this is by loading
	entire files in memory and by relying on the result returned by
	ModPlug_Load, which seems to not be always accurate.

	* Bundles/Mod/Mod.m ([Mod -init]): removed.
	([Mod +load]): initialize the library settings just after the
	Mod bundle is loaded in memory. The "settings" ivar is replaced
	with a local variable.

2004-06-15  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* InfoDisplayController.m ([InfoDisplayController
	-initializeWidgets]): new method that take cares of initializing
	the widgets before they get displayed;

2004-06-11  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/AudioFile/AudioFile.m ([AudioFile
	-_getAudioFileIDOfType:idTypewithMax:max]): new private method to
	retrieve meta data tags from the input file.
	([-readTitle]): returns the title of the song if found.
	([AudioFile -readArtist]): returns the name of the artist of the
	song if found.

	* PreferencesController.m ([PreferencesController
	-loadPreferencesWindow]): test whether the prefs window is visible
	before displaying it so that many invocations of
	loadPreferencesWindow will only display the window once.

	* utils.m (strndup): the algorithm was wrong since it was copying
	one more char than requested when len was < the length of the
	string.

2004-06-09  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Song.m ([Song -readInfos]): determine the title from the
	filename if not present.

2004-06-08  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlaylistController.m ([PlaylistController
	-panel:sendershouldShowFilename:fileName]): new delegate method to
	test the filenames case-insensitively;

	* Song.m ([Song -playlistRepresentation]): use a NSMutableString
	instead of an NSString.

2004-06-07  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* *.m Bundles/*/*.m: renamed _L macro to LOCALIZED since MacOS X
	already defines such a name in its system libraries.

	* utils.m (strndup): added our own version of strndup for MacOS X
	which seems to be lacking it.
	(NSStandardLibraryPaths): idem.

2004-06-06  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/AudioFile/AudioFile.m: new module to read uncompressed
	sound files.
	([AudioFile +load]): disable error string output by setting the AF
	error handler to NULL.

	* utils.m (convert8to16): new function designed to convert 8 bit
	sample frames to 16 bit ones.

2004-06-01  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlaylistController.m ([PlaylistController -startPlayer:sender]):
	startPlaying renamed.
	([PlaylistController -stopPlayer:sender]): stopPlaying renamed.

	* TableViewController.m ([TableViewController
	-_acceptFilesInPasteboard:pboard]): test whether a dragged
	filename is a directory before accepting it.

	* utils.m (fileIsAcceptable): new function, taken from a method
	with the same name in PlaylistController.m;
	(fileIsAReadableDirectory): new function to test whether a
	filename is both readable and a directory;

	* Bundles/Ogg/Ogg.m ([Ogg -streamOpen:fileName]): if no error is
	caught, the NSFileHandle should be retained to avoid a crash in
	the close callback.

2004-05-13  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/Esound/Esound.m ([Esound -threadWillExit]): release lock
	only when no thread is active.

	* Bundles/OSS/OSS.m ([OSS -stopPlayLoop]): release the fileHandle
	to avoid leaks.
	([OSS -threadWillExit]): release lock only when no thread is
	active.

2004-05-08  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/Esound/Esound.m ([Esound -threadWillExit]): 
	* Bundles/OSS/OSS.m ([OSS -threadWillExit]): release the lock to
	avoid a leak.

2004-05-01  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* MainController.m ([MainController
	-validRequestorForSendType:sendTypereturnType:returnType]): on
	GNUstep, execute the same method on the playlistController to make
	sure it declares as a valid requestor. MacOSX doesn't need this.

	* PlaylistController.m ([PlaylistController
	-writeSelectionToPasteboard:pboardtypes:types]): write selection
	to pasteboard only when the selection is not empty.
	([PlaylistController -validRequestorForSendType:returnType:]):
	declare as valid requestor only when the selection is not empty.

	* TableViewController.m ([TableViewController
	-tableView:tableViewmouseDownInHeaderOfTableColumn:tableColumn]):
	invoke saveToDefaults on the playlist when sorted.

	* Bundles/MP3/MP3.m ([MP -readComment:comString]): when the string
	id is not found, return @"".

	* Song.m ([Song -compareByPlaylistRepresentation:aSong]): new
	comparison method for sorting by artist, album, track number,
	title and finally by filename.
	([Song -compareByDuration:aSong]): new comparison method for
	sorting by duration.

	* Playlist.m ([Playlist -sortByDuration]) 
	([Playlist -sortByPlaylistRepresentation]): new
	method to sort the playlist.

	* TableViewController.m ([TableViewController
	-tableView:tableViewmouseDownInHeaderOfTableColumn:tableColumn]):
	new method to trigger the sorting of the playlist depending on the
	column header that was clicked.
	([TableViewController
	-tableView:aTableViewobjectValueForTableColumn:aTableColumnrow:rowIndex]): the "time" column in now identified with "duration", for consistency.

2004-04-30  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Playlist.m ([-loadFromDefaults]): new method to migrate the
	default playlist in the NSUserDefaults database to the default in
	the user's Library/Cynthiune.
	([-saveToDefaults]): save the playlist in the user's
	Library/Cynthiune/DefaultPlaylist.pls.

	* utils.m (invertBytesInBuffer): new function taken from Esound.m
	to swap bytes in an even-size buffer.
	(_linesFromContent): work on a copy of the line where the ending
	character (\n or \r) is replaced with a 0.

	* Bundles/Mod/Mod.m ([Mod
	-readNextChunk:bufferwithSize:bufferSize]): invert bytes in buffer
	on big-endian architectures.

	* PlaylistFile.m ([PlaylistFile -load]): check that fileLines is
	not nil, otherwise do not fill the playlist at all.

	* MainController.m ([MainController
	-loadBundlesInSystemDirectories:aFileManager]): use
	NSStandardLibraryPaths().

	* utils.m (linesOfFile): return nil if the file could not be
	opened.

	* Bundles/Mod/Mod.m ([Mod +bundleClasses]): new libmodplug-based
	plugin bundle to read MODs, XMs, and many many more .....

2004-04-29  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlaylistFile.m ([PlaylistFile -_fillPlaylistWithArray:anArray]):
	don't release the returned song since it's autoreleased.

	* Bundles/Ogg/Ogg.m (oggReadFunc,oggSeekFunc, oggCloseFunc,
	oggTellFunc): new callback function for ov_read_callbacks().
	([Ogg -streamOpen:fileName]): use an NSFileHandle object instead
	of a FILE pointer, pass it as the datasource argument to
	ov_read_callbacks().

	* Bundles/OSS/OSS.m ([OSSPlayerThread -playerThread:dict]):
	release the stream when the thread is ending.
	Same changes as in Esound bundle (see below).

	* PreferencesController.m ([PreferencesController
	-setBundleView:bundlePrefsView]): don't release the returned view
	since it's now autoreleased.

	* Bundles/Esound/Esound.m ([-dealloc]): host is never used.
	Release the lock.
	([EsoundPlayerThread -setStream:aStream]): retain the stream if
	non-nil.
	([EsoundPlayerThread -flushOutputBuffer:dict]): display an error
	message related to the esd socket only if it failed three times to
	reconnect.

	* Playlist.m ([Playlist -loadFromDefaults]): don't release the
	returned song since it's now autoreleased.

	* GeneralPreference.m ([GeneralPreference -preferenceSheet]):
	autorelease the returned view.

	* Bundles/MP3/MP3.m ([MP -readComment:comString]): return an UTF8
	encoded strings.

	* Song.m ([Song -displayRepresentation]): renamed to
	playlistRepresentation. Uses our NSString ivars directly instead
	of their UTF8 or C representation.
	([Song +songWithFilename:aFilename]): return an autoreleased
	object.
	([Song -openStreamForSong]): stream should be autoreleased.

	* Bundles/OSS/OSS.m ([OSSPlayerThread -dealloc]): new method to
	make sure the stream is closed and released when the thread is
	deallocated.

	* Song.m ([Song -filename]): simplified method by using short
	conditions rather than an intermediary variable.
	([-fullFilename]): idem.
	([Song -displayRepresentation]): use UTF8String rather than
	cString on the string components.

	* Bundles/*/*.m (general): we define the NSLocalLocalizedString
	macro for the bundle so that the localized string can be found in
	the plugin directory structure rather than by finding it in the
	main bundle.

	* *.m */*/*.m (general): we now use _L as the localization macro
	all across the project. This macro calls UTF8String on GNUstep, as
	well as NSLocalizedString in the main bundle and
	NSLocalLocalizedString (see above) for the plugin bundles.

	* utils.m (UTF8String): new method to obtain string declared as
	UTF-8 for localized strings. This permit us to use UTF8 encoded
	Localizable.strings files when running in a non-utf8 environment.

2004-04-26  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* InfoDisplayController.m ([InfoDisplayController
	-setReverseTimer:reversed]): accessor to reverseTimer.

	* PlaylistController.m ([PlaylistController
	-changeTimeDisplay:sender]): new method to reverse the time
	display when the timer field is clicked. Originally in
	InfoDisplayController.m.

	* MainController.m ([MainController -_parseArguments]): check that
	no argument beginning with "-" is taken into account.

	* GeneralPreference.m ([GeneralPreference -_initDefaults]): set
	the default output plugin to a reasonable default depending on the
	platform.

	* PlaylistController.m ([PlaylistController
	-_removeSelectedSongs]): new method extracted from removeSong: to
	make code cleaner.

2004-04-25  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* TableViewController.m ([TableViewController
	-tableView:tvwriteRows:rowstoPasteboard:pboard]): MacOSX seems to
	only accept one type of dragged elements at a time...

	* Song.m (general): accessors return a copy of the attributes
	instead of their direct reference.

	* PlaylistController.m ([PlaylistController -removeSong:sender]):
	do not release the selection since it is autoreleased.
	([PlaylistController -_updatePlayer:force]): do not initialized
	the player automatically, display a warning if it's equal to nil.

2004-04-24  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/Esound/Esound.m ([EsoundPlayerThread
	-_invertBufferBytes]): new method for big endian machines about
	which libesd does not give a damn.

	* InfoDisplayController.m ([InfoDisplayController
	-setTimerFromTotalSeconds:seconds]): new method to display the
	total given as parameter in the timer field in bold.
	([InfoDisplayController -resetTimerField]): empties the timer
	field and reset its font back to normal.
	([InfoDisplayController -timerIsReversed]): return the value of
	reverseTimer.

	* PlaylistController.m ([PlaylistController
	-_resetTimeDisplay:aTimer]),
	([PlaylistController -_updateDisplayResetTimer]),
	([PlaylistController -_updateSelectionTimeDisplay]): new methods
	meant to be used when the tableSelectionIsChanging notification is
	triggered so as to show the total time for the selected songs and
	to reset the timer field if needed (when the player is not
	running).

	* MainController.m ([MainController
	-_registerArrayOfClasses:classes]): takes the array of classes for
	each bundle as argument and test all of them with the different
	protocol managers.

	* CynthiuneBundle.h: Cynthiune bundle should now include this file
	to permit the MainController to know all of their classes. Ogg,
	MP3, Esound, OSS, MacOSXPlayer bundles updated.

2004-04-23  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Song.m ([Song -openStreamForSong], [Song -readInfos]): use
	"release" instead of "autorelease" to free the stream from memory.

	* PlaylistFile.m (general): redone the interface to act as a
	regular class rather than a method provider.

	* PlaylistController.m (general): removed loadDefaultList and
	saveDefaultList methods.
	([PlaylistController -saveList:sender]): the callback data passed
	to the sheet is a struct containing the integer for the return
	code but also a saveDir NSString, so that we can directly save the
	result to the correct directory.

	* Playlist.m ([Playlist -dealloc]): new method.
	([Playlist -getSongsAsFilenames]): new method to obtain the
	filenames of the songs listed in the playlist.
	([Playlist -loadFromFile:aFilename]): new method that instantiates
	a PlaylistFile object to load itself from.
	([Playlist -saveToFile:aFilename]): new method that instantiates
	a PlaylistFile object to save itself it.

2004-04-22  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* MainController.m ([MainController -_appWindowDidMove]) 
	([MainController -_playlistWindowDidMove]): new methods extracted
	from windowDidMove: to make code cleaner.

	* InfoDisplayController.m ([InfoDisplayController -init]): new
	method to initialize the class attributes rather than in
	awakeFromNib.

	* MainController.m ([MainController -_initWindowsPosition]): new
	method extracted from awakeFromNib to make code cleaner.

2004-04-20  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* TableViewController.h (NSObject): "songlist" attribute renamed
	to "playlist".

	* TableViewController.m ([TableViewController
	-doubleClick:sender]): the song selected in the playlist is set
	from here rather than in the notification signal in
	PlaylistController.

	* MainController.m ([MainController
	-setPlaylistWindowVisible:isVisible]): new method to replace
	showPlaylistWindow and hidePlaylistWindow for consistency with the
	standard *step APIs.

	* PlaylistController.m (general): references to the
	playlistWindow and the playlistSwitch moved to the MainController
	class as well as all associated method (WindowDidMove,
	WindowDidResize, togglePlaylist, showPlaylistWindow,
	hidePlaylistWindow, repositionWindow, mainHasNewFrame...).
	([PlaylistController -playerSongEnded:aNotification]): we release
	the player whenever we get at the end of the playlist.
	([PlaylistController -stopPlaying:sender]): we release the player
	when stop is pressed.
	([PlaylistController -loadDefaultList]): we don't update the
	tableview anymore since this method is called only once and before
	the tableview is initialized.
	([PlaylistController -_updatePlayer:force]): we are now the only
	method to initialize "player" when it does not exist.

	* Bundles/Esound/Esound.m ([EsoundPlayerThread -dealloc]): close
	the stream before releasing it.

2004-04-19  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* FormatTester.m ([FormatTester +formatTester]): major cleanup,
	all class methods converted to instance methods. This new method
	returns a singleton.

	* TableViewController.m ([TableViewController
	-_songsInRows:rows]): returns an array of songs associated to the
	rows contained in the array passed as argument.
	([TableViewController
	-tableView:tvwriteRows:rowstoPasteboard:pboard]): fille the
	pasteboard with NSFilenamesPboardType elements.
	([TableViewController -_acceptFilesInPasteboard:pboard]): new
	method splitted from  -tableView:validateDrop:proposedRow: to test
	whether the list of files that's being dragged are of a readable
	format.
	([TableViewController
	-tableView:tvacceptDrop:inforow:rowdropOperation:op]): if the
	draggingSource is our table view, query the
	CynthiuneSongListDragType elements from the pasteboard, otherwise
	query the NSFilenamesPboardType.
	([TableViewController -setPlaylist:aPlaylist]): retain and release
	the received playlist.

	* Playlist.m ([Playlist -songAtNSIndex:anIndex]): return the song
	associated to the specified index (passed as NSNumber).

	* GeneralPreference.m ([GeneralPreference -awakeFromNib]):
	* Bundles/Esound/Esound.m ([EsoundPreferences -awakeFromNib]):
	* Bundles/OSS/OSS.m ([OSSPreferences -awakeFromNib]): new method.
	Translate labelled widgets.

	* Bundles/MP3/MP3.m ([MP -readStreamMetaData]): test for XING VBR
	header and compute duration subsequently.

2004-04-18  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/MP3/MP3.m ([MP -init]): added init method.

2004-04-16  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* MainController.m ([MainController -_initMenuLabels]): the
	services menu is defined in Gorm.
	([MainController
	-_setStrings:stringsforSubmenu:menuwithOffset:offset]): new method
	to translate the Windows menu properly at the correct offset after
	the windows list.

	* GeneralPreference.m ([GeneralPreference
	+windowsInformationAreSaved]): new method that returns whether
	windows location saving is set in the preferences.
	([GeneralPreference
	+saveInformation:aWindowforWindow:windowName]): new method to
	store the window state in the NSUserDefaults database.
	([GeneralPreference
	+restoreInformation:aWindowforWindow:windowName]): new method as
	above but to restore and apply that information.
	([GeneralPreference -saveWindowsInformationChanged:sender]): new
	delegate method to set or unset the parameter deciding of the
	windows location saving mechanism.

	* PlaylistController.m ([PlaylistController
	-mainHasNewFrame:aFrame]): initialize the playlist window position
	from the preferences if required.
	([PlaylistController -windowWillClose:aNotification]): save the
	playlist window position from the preferences if required.
	([PlaylistController -_recheckIfIsStuck:aWindow]): new method to
	make windowDidMove: and windowDidResize: smaller.
	([PlaylistController
	-writeSelectionToPasteboard:pboardtypes:types]): new delegate
	method to fill the pasteboard buffers with the selected song
	filenames when a service is invoked.

	* MainController.m ([MainController
	-_setStrings:stringsforMenu:menu]):
	([MainController -_setStrings:stringsforSubmenu:menu]): new
	methods splitted from _initMenuLabels;
	([MainController -_initServices]): new method to list the services
	which accept filenames as parameters.
	([MainController -awakeFromNib]): restore the main window saved
	state if required in the preferences.
	([MainController -windowWillClose:aNotification]): save the main
	window position, size and state if required in the preferences.
	([MainController -validRequestorForSendType:returnType:]):
	delegate method to let NSApplication dispatch the services
	communication messages to the correct object.

	* TableViewController.m ([TableViewController
	-getSelectionAsFilenames]): new method to return the filename of
	the songs that are selected.

	* PlaylistTableView.m ([PlaylistTableView
	-dragImageForRows:dragRowsevent:dragEventdragImageOffset:dragImageOffset]):
	new subclass of NSTableView for providing the correct icon when
	one or more songs are being dragged...

2004-04-13  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* TableViewController.m ([TableViewController -_timeColumnWidth]):
	new method to size the time column progammatically depending on
	the translation for "Time".
	([TableViewController -addNeededColumns]): removed useless
	"aFrame" var.

	* PlaylistController.m ([PlaylistController
	-_initPlaylistPopups]): the NSPopupButton's are repositioned after
	their resizing.

2004-04-12  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* MainController.m ([MainController -awakeFromNib]): the main
	window is now centered before being displayed.

	* GeneralPreference.m ([GeneralPreference -contentView]): 
	* Bundles/Esound/Esound.m ([EsoundPreferences -contentView]): 
	* Bundles/OSS/OSS.m ([OSSPreferences -contentView]): closing the
	bundle window is useless.

	* PreferencesController.m ([PreferencesController
	+loadPreferencesWindow]): make prefs a global variable so that we
	can control whether the prefs window is already displayed.

2004-04-11  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/MacOSX/MacOSXPlayer.m (manage_oggproblem): removed
	obsoleted method.
	([MacOSXPlayer -init]): initialize timer, totalBytes and
	bytesPerSec(new) to 0.
	([-streamRaiseOpenErrorException:errMsg]): removed obsoleted
	method.
	([MacOSXPlayer -timer]): lastTickSeconds attribute renamed to
	"timer".

	* PlaylistController.m ([PlaylistController
	-_initPlaylistPopups]): call sizeToFit on our popups so that we
	make sure their widths is correct after localization.
	([PlaylistController -_runDirOpenPanel:oPanel]),
	([PlaylistController -_runOpenPanel:oPanel]): use
	beginSheetForDirectory:file:types:modalForWindow:modalDelegate:didEndSelector:contextInfo: on GNUstep and MacOSX.

	* MainController.m ([MainController
	-registerBundleClass:aBundle]): new method split from
	loadBundlesForPath:withFileManager:

2004-04-10  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PreferencesController.m ([-writeDictionaryForClass:aClass]):
	removed method.

	* Bundles/Ogg/Ogg.m ([Ogg -streamOpen:fileName]): replaced
	#include's with #import's. Import external files before Ogg.h.

	* Bundles/Ogg/Ogg.h: removed imports from file header.

	* PlaylistFile.m ([PlaylistFile +_parsePLSFile:fileLines]): use
	the C api to determine the beginning of the line instead of
	NSString's.

	* Bundles/MacOSX/MacOSXPlayer.m: updated to the NEW bundle and
	player protocols.

	* Bundles/MP3/MP3.m ([MP +_testMP3Header:buffer]):
	use BYTE_ORDER instead of __BYTE_ORDER.

	* GeneralPreference.m ([GeneralPreference -contentView]): 
	* Bundles/OSS/OSS.m ([OSSPreferences -contentView]): 
	* Bundles/Esound/Esound.m ([EsoundPreferences -contentView]): 
	use "release" instead of "dealloc" to avoid crashing.

	* TableViewController.m ([NSTableView
	-dragImageForRows:event:dragImageOffset:]): override this method
	to display the "note(s)" drag icon.
	([TableViewController -awakeFromNib]): add self as an observer for
	the NSViewDidFrameNotification of our parent's parent's, the
	scrollView.
	([TableViewController -scrollViewDidResize:aNotif]): new method to
	resize our columns when needed.
	([TableViewController -addNeededColumns]): add a title to identify
	our columns.

2004-04-05  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PreferencesController.m ([PreferencesController
	-setBundleView:bundlePrefsView]): different but better algorithm
	for displaying the prefs page.

	* GeneralPreference.m ([GeneralPreference -initializeSelector]):
	when no output bundle was found, display "None" and disable the
	widget.
	([GeneralPreference -initializeWithDict:aDict]): initialize the
	defaults output bundle from the selector only *if* the bundle list
	is not empty.

	* MainController.m ([MainController -_initMenuLabels]): menus on
	MacOSX and GNUstep are different so we have to write a
	double-method.

2004-03-29  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/MP3/MP3.m ([MP +streamTestOpen:fileName]): if the file
	can't be opened, returns 'NO'.

	* MainController.m ([MainController
	-loadBundlesInLocalDirectory:aFileManager]): computes the Bundle
	directory for the Application directory instead of hard-coding it.

	* Bundles/MP3/MP3.m ([MP +_testMP3Header:buffer]): added support
	for MPEG 2.5 files.

2004-03-28  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/MP3/MP3.m ([MP +_seekOffset:_f]): new method to return
	the first-non zero character of a stream.
	([MP +_testRIFFHeader:bufferinFile:_fwithOffset:offset]): new
	method that tests whether a RIFF file contains an MP3 stream.
	([MP +_testMP3Header:buffer) new method split from
	+streamTestOpen: to test a basic MPEG audio header.

2004-03-22  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/MP3/MP3.m ([MP +streamTestOpen:fileName]): we do now
	provide support for MP2 and MPEG 2 Layer 2/3 streams. "So many
	standards to choose from...".

2004-02-27  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/MP3/MP3.m ([MP +streamTestOpen:fileName]): we do now
	provide support for RIFF-encapsulated MPEG and MPEG Layer 3
	streams.

2004-02-18  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/Esound/Esound.m ([EsoundPreferences
	-selectTcpBtn:sender]): set the text fields visibily enabled.
	([EsoundPreferences -selectUnixBtn:sender]): set the text fields
	visibily disabled.

2004-02-15  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* MainController.m ([MainController -_initMenuLabels]): set
	submenu titles too.

2004-02-14  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* utils.m (logRect): new function to display an NSRect's
	coordinates.

	* PlaylistController.m ([PlaylistController -saveDefaultList]):
	synchronize defaults when saving playlist.
	([PlaylistController -_addSongsFromOPanel:oPanel]): update default
	playlist when new files are added.
	([PlaylistController -_addDirSongsFromOPanel:oPanel]): idem.
	([PlaylistController -removeSong:sender]): idem, when removing
	songs.

	* PreferencesController.m ([PreferencesController
	+loadPreferencesWindow]): initialize prefs window title for I18N;
	([PreferencesController -setBundleView:bundlePrefsView]): new
	way of positioning preference subviews.

	* GeneralPreference.m ([GeneralPreference
	+registerPlayerClass:aClass]): display the warning regarding
	bundles only when it's real.

	* MainController.m ([MainController -_initMenuLabels]): new method
	to initalize i18nized menu labels.

2004-02-13  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlaylistController.m ([PlaylistController
	-windowDidResize:aNotification]): new method to avoid positioning
	window disgracefully after it's resized (with isStuck is YES).

2004-02-05  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlaylistController.m ([PlaylistController
	-_updatePlayer:force]): updatePlayer now takes a BOOL argument
	'force'. Also, was renamed to "_updatePlayer:".
	([PlaylistController -tableDoubleClick:aNotification]): force
	updatePlayer to restart the current song when double-clicked.
	([PlaylistController -playerSongEnded:aNotification]): when repeat
	is on, do repeat the song even if it's the only one. Otherwise,
	reinitialize the playlist position and stop.

2004-01-20  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlaylistController.m ([PlaylistController -removeSong:sender]):
	don't go to the next song when the song being played is not
	selected.
	([PlaylistController -_initButtonImages]): new shuffle button;

2004-01-19  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* MainController.m ([MainController -parseArguments]): new method
	to add song filenames given as command-line parameters to the
	playlist;

	* PlaylistController.m ([PlaylistController -removeSong:sender]):
	fixed a subtle bug that was preventing the shuffle mode from
	working properly. When deleting a song, the next song in the real
	list, rather than in the shuffle list, was selected.
	([PlaylistController -_initButtonImages]): new repeatButton taken
	into ccount.

2004-01-16  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/Ogg/Ogg.m ([Ogg +streamTestOpen:fileName]): don't
	display error when the file tested is just not a vorbis stream.

2004-01-14  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlaylistController.m ([PlaylistController -removeSong:sender]):
	test if playlist is non-empty before removing any element.

	* Bundles/dummy/dummy.m ([dummyPlayerThread -playerThread:dict]):
	don't crash when stopping player.

	* Bundles/MP3/MP3.m ([MP +streamTestOpen:fileName]): implement a
	real test on file headers for both little- and big-endian
	machines.

2004-01-12  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlaylistController.m ([PlaylistController
	-_fileIsAcceptable:fileName]): new method to test whether a file
	exists, is a regular file or a symlink to a regular file.
	([PlaylistController
	-_addSongsFromArray:songArraywithDir:aDirectory]): accepts an
	optional directory name to prepend to the filenames.

	* Bundles/dummy/dummy.m: new output bundle, outputting to no
	device for debugging purpose.

	* PlaylistController.m ([PlaylistController -_initButtonImages]):
	added "playlist-show" and "playlist-hide" as button images.

2004-01-11  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/MP3/MP3.m: copyright infos updated + portability
	#ifdef's.

	* MainController.m: General: portability "#ifdef NeXT_PDO"'s and
	related code. 
	([MainController -loadBundlesInLocalDirectory:aFileManager]):
	simplified local bundle loading for Openstep/Win32.

	* Bundles/Ogg/Ogg.m ([Ogg +errorText:error]): new class method to
	replace lastErrorText. Used in streamTestOpen:.
	General: portability "#ifdef NeXT_PDO"'s and related code.

2004-01-06  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/Ogg/Ogg.m ([Ogg -streamClose]): it seems ov_clear
	already calls free().

2003-12-31  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Song.m ([Song -openStreamForSong]): uses NSFileManager's
	fileExistsAtPath: method instead of access().

2003-12-30  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Player.h: togglePause and toggleMuted changed respectively to
	setPaused/paused and setMuted/muted.

2003-12-29  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* CynthiuneInfo.plist: release 0.9.

	* GNUmakefile (APP_NAME): added VERSION variable and set it to 0.9.

	* Bundles/Esound/Esound.m ([EsoundPlayerThread
	-playerThread:dict]): check streamToRelease and close + release if
	non-nil.
	([EsoundPlayerThread -setStream:aStream]): if streamToRelease is
	already allocated, we wait for the thread loop to release it.

	* Bundles/OSS/OSS.m: same as above.

	* PlaylistController.m ([PlaylistController
	-songCursorChange:sender]): update the timer depending on the
	chosen position so that the user see an indication of where (s)he
	is within the song.
	([PlaylistController -toggleMute:sender]): initialize the player
	if it's not running so that we can mute it even when nothing has
	played yet.
	([PlaylistController -songCursorChange:sender]): the time throttle
	is really active now.
	([PlaylistController -updatePlayer]): display info for the actual
	player song so that we don't show invalid informations since we
	could be called twice if a stream is invalid.

	* Playlist.m ([Playlist -insertSong:newSong:aPos]): increase
	currentSongNumber when aPos <= to it.
	([Playlist -moveSongsWithRows:aRowsListto:newPos]):
	save current song and restore currentSongNumber at the end.

	* Bundles/Esound/Esound.m ([EsoundPlayerThread -seek:aPos]): same
	as below.

	* Bundles/OSS/OSS.m ([OSSPlayerThread -seek:aPos]): new method:
	seek in the stream and update totalBytes.

	* Bundles/Ogg/Ogg.m ([Ogg -isSeekable]): we call ov_seekable and
	return its result.
	([Ogg -seek:aPos]): Ogg's are seekable.

	* Bundles/MP3/MP3.m ([MP -isSeekable]): pseudo method always
	returning YES.
	([MP -seek:aPos]): MP3's are seekable.

	* Player.h: impose a new "seek:" method to Player classes.

	* Format.h: impose new "- isSeekable" and "seek:" methods to
	Format classes.

	* Song.m ([Song -readInfos]): don't read infos of file that can't
	be opened.
	([Song -isSeekable]): new method to verify that the position in
	the song can be changed.

	* MainController.m ([MainController -appWindow]): new method to
	return the player window.

	* GeneralPreference.m ([GeneralPreference
	-playlistFormatChanged:sender]): new method/callback to save the
	specified playlist format.

2003-12-28  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlaylistController.m ([PlaylistController -updatePlayer]):
	update the progressSlider only at song change.

	* TableViewController.m ([TableViewController
	-_acceptDroppedRows:aRowsListatRow:row]): reselect all previously
	selected songs, not just the first and last ones.

	* PlaylistController.m ([PlaylistController
	-windowDidMove:aNotification]): fixed windows stickyness by
	testing the condition that applies for each axis.
	([PlaylistController -removeSong:sender]): sets the
	currentSongNumber to the first selected song or, if the player is
	running, to the song that is being played.
	([PlaylistController -playerStopped:aNotification]): don't select
	the first song when stopped playing.

2003-12-27  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlaylistController.m ([PlaylistController -saveList:sender]):
	defaults entry for saving playlists is now
	"DefaultPlaylistDirectory" instead of "NSDefaultSaveDirectory" for
	exactness.

	* utils.m (linesOfFile): refactoring: previous method
	"+_linesFromContentL" from PlaylistFile.m.
	Added proper copyright notice.

	* PlaylistFile.m ([PlaylistFile
	+savePlaylist:anArraytoFile:aFile]): new method to convert and
	save the array of songs.
	([PlaylistFile +_PLSContentWithArray:anArray]) and
	([PlaylistFile +_M3UContentWithArray:anArray]): new methods to
	convert an array of songs, return an NSString with the playlist in
	the appropriate format.
	([PlaylistFile +_linesFromContent:content]): manage DOS-formatted
	files.

	* GeneralPreference.m ([GeneralPreference
	+preferredPlaylistFormat]): new method to determine the user's
	preferred playlist format to use when saving the playlist.

	* PlaylistController.m ([PlaylistController -saveList:sender]):
	new method to save current playlist.
	([PlaylistController -init]): new attribute "playlistFilename" set
	to nil.

	* Bundles/OSS/OSS.m: aligned code with recent changes in Esound
	bundle.

	* Bundles/Esound/Esound.m ([Esound -setSong:aSong]): "seconds"
	attribute no longer used, computed when getSeconds is called.

	* PlaylistController.m ([PlaylistController -awakeFromNib]):
	disable progressSlider by default.
	([PlaylistController -updatePlayer]): en-/disable the
	progressSlider depending on the song "seekability".

	* Song.m ([Song -isSeekable]): new method to determine whether the
	cursor can be moved within the song.
	([Song -seek:aPos]): new method to change the time cursor.

	* Bundles/OSS/OSS.m ([OSS -timer]): compute time when called.

	* Song.m ([Song +songWithFilename:aFilename]): new method to alloc
	and init a new song at the same time;

2003-12-20  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* TableViewController.m ([TableViewController
	-tableView:aTableViewobjectValueForTableColumn:aTableColumnrow:rowIndex]): if title string is empty, only put the song's filename between brackets.

	* PlaylistController.m ([PlaylistController -showPlaylistWindow]):
	use [w orderFront] rather than [w orderBack];
	([PlaylistController -addSong:sender]) and
	([PlaylistController -removeSong:sender]): compare to translated
	label titles. 
	([PlaylistController -awakeFromNib]): initalize progressSlider.
	([PlaylistController -switchToSong:aSongplayerIsRunning:running]),
	([PlaylistController -playerPlaying:aNotification]),
	([PlaylistController -playerStopped:aNotification]), 
	([PlaylistController -playerSongEnded:aNotification]): set
	progressSlider's max value to relevant value depending on the case
	(new song or song stopped).
	([PlaylistController -playerUpdateTimer:aNotification]): update
	progressSlider's value.

	* MainController.m ([MainController -openFile:anObject]): new
	method to add a new song to the playlist from the Document->open
	menu.

	* InfoDisplayController.m ([InfoDisplayController -show]): set
	translated image name (Localizable.strings).
	([InfoDisplayController -updateInfoFieldsFromSong:aSong]): really
	set title from deduced value rather than directly from [aSong
	title].

2003-12-19  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* TableViewController.m ([TableViewController -addNeededColumns]):
	added a column for song duration time;

	* InfoDisplayController.m ([InfoDisplayController
	-changeTimeDisplay:sender]): activated switching of timer display
	(forward/backward).

	* utils.m: helper functions.
	(timeStringFromSeconds): code previously found in
	InfoDisplayController.

	* Format.h: changed typing for readChannels, readRate. Added
	readDuration method, to return the stream length;

2003-12-18  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Playlist.m ([Playlist +_linesFromContent:content]): new
	singleton class to read .pls and .m3u playlist files.

	* Bundles/Esound/Esound.m ([EsoundPlayerThread
	-flushOutputBuffer:dict]): reinit esdDsp from the dict at each
	iteration to avoid writing to a closed filedesc.

	* PlaylistController.m ([PlaylistController
	-togglePlaylist:sender]): display or hide the new playlist window;

	* TableViewController.m ([TableViewController -init]): as a child
	of playlistcontroller, tvc no longer has the playlist outlet and
	now forwards the TableView clicks to its delegate.

	* PlaylistController.h: new outlet: TableViewController, for which
	we act as a delegate.

	* PlaylistController.m ([PlaylistController
	-windowDidMove:aNotification]): implemented window magnetism.

2003-12-15  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlaylistController.m ([PlaylistController
	-playerStopped:sender]): release player when stopped, so that we
	can choose another one.

	* Bundles/MP3/MP3.m ([MP
	-readNextChunk:bufferwithSize:bufferSize]): loop when steam.error
	== MAD_ERROR_LOSTSYNC.

	* PlaylistController.m ([PlaylistController
	-playerPaused:sender]): set button state only from delegate.
	functions.

2003-12-14  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Bundles/MP3/MP3.m ([MP +acceptedFileExtensions]): accepts .mpa,
	.mpga, .mpega files + uppercases.

2003-12-13  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* OutputPreference.m ([OutputPreference +initializeList]): new
	preference module and handler for selecting the output bundle to
	use.

	* MainController.m ([MainController
	-loadBundlesForPath:aPathwithFileManager:aFileManager]): bundle
	conform to the "Player" protocol are registered with the
	OutputPreference class.

	* InfoDisplayController.m ([InfoDisplayController -show]): only
	use on NSImageView now for active and inactive splash images.
	([InfoDisplayController -changeTimeDisplay:sender]): new stub
	action connected to songTimerField;

	* Bundles/OSS/OSS.m: added OSSPreferences class, copied from
	Esound.

	* Bundles/OSS/GNUmakefile: added OSSPreferences.gorm to the
	RESOURCE_LIST

2003-12-12  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* MainController.m ([MainController
	-loadBundlesForPath:aPathwithFileManager:aFileManager]): scan for
	bundles.

	* PreferencesController.[hm]: new controller for Preferences.gorm.

	* Preference.h: new Preference protocol for classes implementing
	preference sheet handling.

	* NEWS: updated with the new nice features we've added recently.

	* Bundles/Esound/Esound.m: new Esound
	output class, based on OSS. With the same thread model and a
	controller class for its preference panel
	(EsoundPreferences.gorm).

	* Bundles/OSS/OSS.m: old GNUstepPlayer.[hm].
	the OSS class is a childclass of PlayerBase and conforms to the
	Player and Preference protocol.

	* Bundles/Ogg/Ogg.[hm]: old OggStream.[hm]

	* Bundles/MP3/MP3.m ([MP
	-translateBufferToPCM:bufferwithSize:bufferSize]): compute
	the difference between buffer returned by libmad and the player
	buffer, to avoid a buffer overrun.

	* Bundles/MP3/MP3.[hm]: old MP3Stream.[hm]

	* InfoDisplayController.m ([InfoDisplayController
	-updateInfoFieldsFromSong:aSong]): field code simplified by the
	splitting of the album and artist fields.
	([InfoDisplayController -awakeFromNib]): We use boldSystemFont for
	song name and systemFont for the rest.

	* InfoDisplayController.[h,m]: album and artist fields are not
	splitted from each other. We don't use a tabview anymore, just
	overlapped images.

	* GNUmakefile.preamble: link to libmcheck (malloc checks) when
	$(debug) is set to 'yes'. References to format libraries and
	headers moved out.

	* GNUmakefile: added new Bundles to the list of SUBPROJECTS. Added
	Images/eject.tiff to the list of RESOURCE_FILES.

	* FormatTester.m: is now feeded decoder classes (conform to the
	Format protocol) and their extensions by new PreferencesController
	class;

	* Format.h: Format protocol. For decoder modules.

2003-12-08  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Song.m ([Song -readInfos]): we retain returned NSStrings here
	now rather than in the formats readers.

	* GNUstepPlayer.m: GNUstepPlayer is a child class of PlayerBase
	and responds to "Player" protocol. Common methods moved into
	Player.m.

	* Player.m ([PlayerBase -init]): new. Implementation of PlayerBase
	class.

	* Player.h: definition of "Player" protocol and PlayerBase class.

2003-12-04  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* Song.m ([Song -openStreamForSong]): test if the Song file is
	still accessible, return nil if not so that we don't crash.

	* PlaylistController.m ([PlaylistController
	-TableDoubleAction:sender]): we use switchToSong for coherence.

	* GNUstepPlayer.m ([PlayerThread -threadDidStart:aDict]): use
	NSDebugLog() instead of NSLog().
	([PlayerThread -threadWillExit:aDict]): ditto.
	([PlayerThread -playerThread:dict]): if the thread exits with
	(stream == nil), it means the song ended (even if it didn't even
	start playing).

	* FormatTester.m ([FormatTester +classForFile:filePath]): fixed
	sizeof() to return the correct amount of elements in the format
	list.

2003-12-03  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* GNUstepPlayer.m ([PlayerThread -flushOutputBuffer:dspFd]):
	reenabled this method for clarity.

	* PlaylistController.m ([PlaylistController
	-switchToSong:aSongTVCIs:tvcplayerIsRunning:running]): don't
	stop/restart the player when changing song. Also, we now update
	the display with the new song's informations.
	([PlaylistController -playerSongEnded:sender]): stop playloop if
	no song is left in the list. This let the thread exit and reset
	the GUI.

2003-12-02  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* PlaylistController.m ([PlaylistController -addSong:sender]):
	play with NSDefaultDirectory to remember last opened directory;

2003-11-28  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* MP3Stream.m ([MP -audioLinearDither:samplewithDither:dither]):
	dithering method copied from madplay.
	([MP -translateBufferToPCM:bufferwithSize:bufferSize]):
	method copied from madplay: audio_pcm_s16le.
	([MP -calcInputRemain]): new method to clarify code.
	([MP -readStreamMetaData]): read first valid frame and deduce
	channels and rate from it.
	([MP -streamInit]): invoke readStreamMetaData.
	([MP -translateBufferToPCM:bufferwithSize:bufferSize]): 'offset'
	renamed to 'start', 'max' to 'limit'.
	([MP -fillPCMBuffer:bufferwithStart:startandLimit:limit]): new
	method extracted from
	-translateBufferToPCM:bufferwithSize:bufferSize to clarify code.

	* MacOSXPlayer.m (inputCallback): ref to OggStream removed.

	* GNUstepPlayer.m ([Player -handleReadProblem:bytesRead]):
	manageOggProblem renamed.

2003-11-26  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* FormatTester.m ([FormatTester +fileTypeKnown:filePath]): changed
	to a class method.

	* PlaylistController.m ([PlaylistController
	-_addSongsFromOPanel:oPanel]): private method to make addSong
	lighter.
	([PlaylistController -addSong:sender]): accept mp3 as filetype.

2003-01-06  Wolfgang Sourdeau  <Wolfgang@Contre.COM>

	* InfoDisplayController.m ([InfoDisplayController
	-updateInfoFieldsFromSong:aSong]): ditto.

	* TableViewController.m ([TableViewController
	-tableView:aTableViewobjectValueForTableColumn:aTableColumnrow:rowIndex]): enhanced display for incomplete song metadata.

	* InfoDisplayController.m ([InfoDisplayController
	-updateInfoFieldsFromSong:aSong]): do not display a dash whenever
	one of the album name or artist name is missing.

2003-01-02  Wolfgang Sourdeau  <wolfgang@contre.com>

	* main.m: release 0.4

	* MainController.m ([MainController
	-windowWillClose:aNotification]): using a static BOOL, test wether
	the close notification has been called to avoid infinite looping
	and a SIGSEGV (especially on GNUstep).

	* *.[hm]: updated copyright info with year 2003.

	* OggStream.m ([OggStream -readChannels]): new function.
	([OggStream -readRate]): new function.

	* GNUstepPlayer.m ([Player -playIteration:sender]): fill the whole
	buffer first and write it in one shot to avoid too many write()'s.
	([Player -setSong:aSong]): added code to make it able to read one
	channel songs.
	([Player -audioInit]): tune the audio dsp.

2002-12-25  Wolfgang Sourdeau  <wolfgang@contre.com>

	* Initial release.